home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / audio / bz / bzobjs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  61.5 KB  |  2,761 lines

  1. /*
  2.  * Copyright (C) 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /***************************************************************************
  18.  *
  19.  * @(#) - BZ - Multiplayer tank game.
  20.  *
  21.  * $Id: bzobjs.c,v 1.6 1993/08/11 19:46:08 adele Exp $
  22.  *
  23.  *                    Chris Fouts - Silicon Graphics, Inc.
  24.  *                    October, 1991
  25.  **************************************************************************/
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <unistd.h>
  29. #include <math.h>
  30. #include <sys/types.h>
  31. #include <sys/stat.h>
  32. #include <fcntl.h>
  33.  
  34. #include <X11/Intrinsic.h>
  35. #include <X11/StringDefs.h>
  36. #include <Xm/Xm.h>
  37. #include <X11/Xirisw/GlxMDraw.h>
  38. #include <gl/gl.h>
  39. #include "bz.h"
  40. #include "bzobjs.h"
  41. #include "obstacles.h"
  42. #include "bzscreen.h"
  43.  
  44. #define    MV_COLOR(a,b)        if( mv_RGB ) cpack(a) ; else color( b )
  45.  
  46. long *longimagedata( const char *file ) ;
  47.  
  48. /* BEGIN PROTOTYPES -S bzobjs.c */
  49. static void draw_tcirc( float x, float y, float r, int steps, int clip,
  50.                 int show_norms, float a ) ;
  51. static void make_ramp( Colormap cmap ) ;
  52. static void set_mapcolor( Colormap cmap, unsigned long i, unsigned short r,
  53.                 unsigned short g, unsigned short b ) ;
  54. static void show_logo( GL_Object logo, int type, int is_right, int side ) ;
  55. /* END PROTOTYPES -S bzobjs.c */
  56.  
  57. static char    *version_id = "$Id: bzobjs.c,v 1.6 1993/08/11 19:46:08 adele Exp $" ;
  58.  
  59. static GL_Object    obj_count = 1 ;
  60.  
  61. #define OBSTACLE_MATERIAL        1
  62. #define GREEN_TANK_MATERIAL        2
  63. #define BLUE_TANK_MATERIAL        3
  64. #define RED_TANK_MATERIAL        4
  65. #define MISSILE_MATERIAL        5
  66. #define MAN_MATERIAL            6
  67.  
  68. #define QX01   5.0        /* tank 0 coordinates */
  69. #define QX02   2.5
  70. #define QX03   0.0
  71. #define QX04   4./14.5
  72. #define QY01 -10.0
  73. #define QY02  -9.5
  74. #define QY03  -9.0
  75. #define QY04  -6.0
  76. #define QY05  -5.0
  77. #define QY06   0.0
  78. #define QY07   1./3.
  79. #define QY08   2./3.
  80. #define QY09   1.0
  81. #define QY10   5.0
  82. #define QY11   5.5
  83. #define QY12   6.0
  84. #define QY13  10.0
  85. #define QZ01   0.0
  86. #define QZ02   1.0
  87. #define QZ03   2.0
  88. #define QZ04  38./14.5
  89. #define QZ05  46./14.5
  90. #define QZ06  52./14.5
  91. #define QZ07  54./14.5
  92. #define QZ08   4.0
  93. #define QZ09  62./14.5
  94. #define QZ10   5.0
  95.  
  96. #define PX01   5.0        /* tank 1 coordinates */
  97. #define PX02   2.5
  98. #define PX03   0.0
  99. #define PX04   2.5/9.
  100. #define PY01 -10.0
  101. #define PY02  -8.0
  102. #define PY03  -4.0
  103. #define PY04   1.1
  104. #define PY05   1.4
  105. #define PY06   1.7
  106. #define PY07   2.0
  107. #define PY08  10.0
  108. #define PY09  12.0
  109. #define PZ01   0.0
  110. #define PZ02  20./9.
  111. #define PZ03  25./9.
  112. #define PZ04  30./9.
  113. #define PZ05  35./9.
  114. #define PZ06   5.0
  115.  
  116. #define RX01   5.0        /* tank 1 coordinates */
  117. #define RX02   2.5
  118. #define RX03   0.0
  119. #define RX04   2.5/9.
  120. #define RY01 -10.0
  121. #define RY02  -5.0
  122. #define RY03  -3.0
  123. #define RY04  17./9.
  124. #define RY05  23./9.
  125. #define RY06  33./9.
  126. #define RY07  39./9.
  127. #define RY08   8.0
  128. #define RY09  10.0
  129. #define RZ01   0.0
  130. #define RZ02   1.5
  131. #define RZ03  22./9.
  132. #define RZ04  25./9.    /* gun barrel bot */
  133. #define RZ05  30./9.    /* gun barrel top */
  134. #define RZ06  33./9.
  135. #define RZ07  36./9.
  136.  
  137. #define MX01   0.25        /* missile coordinates */
  138. #define MX02   0.14
  139. #define MX03   0.00
  140. #define MY01  -1.00
  141. #define MY02   1.00
  142. #define MZ01   0.25
  143. #define MZ02   0.14
  144. #define MZ03   0.00
  145.  
  146. #define    FX00     0.0    /* flag coordinates */
  147. #define    FX01     2.5
  148. #define    FY00     0.0
  149. #define    FY01     2.5
  150. #define    FZ00     8.0
  151. #define    FZ01    12.0
  152. #define    FZ02    16.0
  153.  
  154. #define NADA  0        /* nothing    */
  155. #define BACK  1        /* back        */
  156. #define RIGH  2        /* right    */
  157. #define FRON  3        /* front    */
  158. #define RPIT  4        /* right pit    */
  159. #define RBAR  5        /* right barrel    */
  160. #define FPIT  6        /* front pit    */
  161. #define LPIT  7        /* left pit    */
  162. #define LBAR  8        /* left barrel    */
  163. #define LEFT  9        /* left        */
  164. #define FBAR 10        /* front barrel    */
  165. #define BPIT 11        /* back pit    */
  166.  
  167. extern Colorindex        ramp0, ramp1, ramp2, ramp3, ramp4 ;
  168. extern Colorindex        black, red, yellow, green, white, blue ;
  169. extern long                over_mode ;
  170. extern Boolean            mv_RGB ;
  171. extern Boolean            use_textures ;
  172. Colorindex                grey ;
  173. Colorindex                o00 ;
  174. Colorindex                o01 ;
  175. Colorindex                o02 ;
  176. Colorindex                o03 ;
  177. Colorindex                o04 ;
  178. Colorindex                o05 ;
  179. Colorindex                o06 ;
  180. Colorindex                o07 ;
  181. Colorindex                t00[N_TEAMS] ;
  182. Colorindex                t01[N_TEAMS] ;
  183. Colorindex                t02[N_TEAMS] ;
  184. Colorindex                t03[N_TEAMS] ;
  185. Colorindex                t04[N_TEAMS] ;
  186. Colorindex                t05[N_TEAMS] ;
  187. Colorindex                t06[N_TEAMS] ;
  188. Colorindex                t07[N_TEAMS] ;
  189. Colorindex                m00 ;
  190. Colorindex                m01 ;
  191. Colorindex                m02 ;
  192. Colorindex                m03 ;
  193. Colorindex                ground_color ;
  194. unsigned long            mv_black  ;
  195. unsigned long            mv_red    ;
  196. unsigned long            mv_green  ;
  197. unsigned long            mv_yellow ;
  198. unsigned long            mv_white  ;
  199. unsigned long            mv_ground_color ;
  200. extern GL_Object        flag_homes ;
  201. extern GL_Object        null_obj ;
  202. extern float            mv_w ;
  203. extern float            mv_h ;
  204. extern float            mv_m ;
  205. extern GL_Object        mv_black_clear ;
  206. extern GL_Object        mv_guided_bg ;
  207. extern GL_Object        mv_normal_bg ;
  208. extern GL_Object        mv_set_red ;
  209. extern GL_Object        mv_set_yellow ;
  210. extern GL_Object        mv_set_white ;
  211. extern GL_Object        tank_logo[] ;
  212. extern int                tank_logo_side[] ;
  213. extern GL_Object        tank[N_TEAMS][N_TYPES][N_VIEWS] ;
  214. extern GL_Object        missile[N_VIEWS] ;
  215. extern GL_Object        crosshairs ;
  216. extern Matrix            id_mat ;
  217. extern Boolean            view_only ;
  218. extern GL_Object        radar1 ;
  219. extern GL_Object        ground ;
  220. extern GL_Object        border ;
  221. extern GL_Object        flag_homes_mv ;
  222. extern GL_Object        sky ;
  223. extern GL_Object        msl_expl[] ;
  224. extern GL_Object        lights_on ;
  225. extern GL_Object        lights_off ;
  226. extern Boolean            transparentExplosion ;
  227. extern Boolean            use_pups ;
  228. extern Display            *display ;
  229. extern Widget            toplevel ;
  230. extern Boolean            db_base ;
  231. extern Boolean            mv_RGB ;
  232. extern GL_Object        digit[][2] ;
  233. extern GL_Object        man_part ;
  234. extern GL_Object        explosion[N_TEAMS][EXPDURATION][N_TYPES] ;
  235. extern Boolean            showMan ;
  236. extern GL_Object        cube[N_VIEWS] ;
  237. extern GL_Object        pyrm[N_VIEWS] ;
  238. extern char                *basename ;
  239. extern GL_Object        flag[N_FLAGS][N_VIEWS] ;
  240. extern Boolean            show_logos ;
  241.  
  242.  
  243.  
  244. int order_tank_0[][11] = {
  245.     {FBAR,RBAR,RPIT,BPIT,RIGH,BACK,NADA,NADA,NADA,NADA,NADA },
  246.     {FBAR,RBAR,BPIT,RPIT,BACK,RIGH,NADA,NADA,NADA,NADA,NADA },
  247.     {FRON,FPIT,FBAR,RBAR,RPIT,RIGH,NADA,NADA,NADA,NADA,NADA },
  248.     {RIGH,FRON,RPIT,FPIT,RBAR,FBAR,NADA,NADA,NADA,NADA,NADA },
  249.     {LEFT,FRON,LPIT,FPIT,LBAR,FBAR,NADA,NADA,NADA,NADA,NADA },
  250.     {FRON,FPIT,FBAR,LBAR,LPIT,LEFT,NADA,NADA,NADA,NADA,NADA },
  251.     {FBAR,LBAR,BPIT,LPIT,BACK,LEFT,NADA,NADA,NADA,NADA,NADA },
  252.     {FBAR,LBAR,LPIT,BPIT,LEFT,BACK,NADA,NADA,NADA,NADA,NADA } } ;
  253.  
  254. int order_tank_1[][10] = {
  255.     {FPIT,RBAR,RPIT,FRON,RIGH,BACK,NADA,NADA,NADA,NADA },
  256.     {FBAR,FPIT,RBAR,RPIT,BACK,RIGH,NADA,NADA,NADA,NADA },
  257.     {FRON,FPIT,FBAR,RBAR,RPIT,RIGH,NADA,NADA,NADA,NADA },
  258.     {RIGH,FRON,RPIT,FPIT,RBAR,FBAR,NADA,NADA,NADA,NADA },
  259.     {LEFT,FRON,LPIT,FPIT,LBAR,FBAR,NADA,NADA,NADA,NADA },
  260.     {FRON,FPIT,FBAR,LBAR,LPIT,LEFT,NADA,NADA,NADA,NADA },
  261.     {FBAR,LBAR,FPIT,LPIT,BACK,LEFT,NADA,NADA,NADA,NADA },
  262.     {LBAR,FPIT,LPIT,FRON,LEFT,BACK,NADA } } ;
  263.  
  264. int order_obst[][4] = {
  265.         {RIGH,BACK,NADA,NADA },
  266.         {BACK,RIGH,NADA,NADA },
  267.         {FRON,RIGH,NADA,NADA },
  268.         {RIGH,FRON,NADA,NADA },
  269.         {LEFT,FRON,NADA,NADA },
  270.         {FRON,LEFT,NADA,NADA },
  271.         {BACK,LEFT,NADA,NADA },
  272.         {LEFT,BACK,NADA,NADA } } ;
  273.  
  274. int order_missile[][4] = {
  275.         {LEFT,RIGH,BACK,NADA },
  276.         {LEFT,BACK,RIGH,NADA },
  277.         {LEFT,FRON,RIGH,NADA },
  278.         {LEFT,RIGH,FRON,NADA },
  279.         {RIGH,LEFT,FRON,NADA },
  280.         {RIGH,FRON,LEFT,NADA },
  281.         {RIGH,BACK,LEFT,NADA },
  282.         {RIGH,LEFT,BACK,NADA } } ;
  283.  
  284. GL_Object    back[N_TEAMS][N_TYPES] ;
  285. GL_Object    right[N_TEAMS][N_TYPES] ;
  286. GL_Object    front[N_TEAMS][N_TYPES] ;
  287. GL_Object    right_pit[N_TEAMS][N_TYPES] ;
  288. GL_Object    right_barrel[N_TEAMS][N_TYPES] ;
  289. GL_Object    front_pit[N_TEAMS][N_TYPES] ;
  290. GL_Object    left_pit[N_TEAMS][N_TYPES] ;
  291. GL_Object    left_barrel[N_TEAMS][N_TYPES] ;
  292. GL_Object    left[N_TEAMS][N_TYPES] ;
  293. GL_Object    front_barrel[N_TEAMS][N_TYPES] ;
  294. GL_Object    back_pit[N_TEAMS][N_TYPES] ;
  295. GL_Object    tankMaterial[N_TEAMS] ;
  296.  
  297. DECLARE( MVIEW ) ;
  298. DECLARE( RADAR ) ;
  299. DECLARE( HEAD ) ;
  300. DECLARE( LOADM ) ;
  301. DECLARE( READY ) ;
  302. DECLARE( SCORE ) ;
  303. DECLARE( LIVES ) ;
  304. DECLARE( LEVEL ) ;
  305. DECLARE( NOPLY ) ;
  306. DECLARE( RIGHT ) ;
  307. DECLARE( LEFTT ) ;
  308. DECLARE( MESGS ) ;
  309. DECLARE( OUTMS ) ;
  310. DECLARE( GROND ) ;
  311. DECLARE( LOGOD ) ;
  312. DECLARE( MINES ) ;
  313. DECLARE( FLAGS ) ;
  314.  
  315. float missile_front_a[] = {
  316.     1.,
  317.     3.,
  318.      MX02, MY01, MZ01,
  319.      MX03, MY02, MZ03,
  320.     -MX02, MY01, MZ01,
  321.     } ;
  322. float missile_front_b[] = {
  323.     1.,
  324.     3.,
  325.     -MX02, MY01,-MZ01,
  326.      MX03, MY02, MZ03,
  327.      MX02, MY01,-MZ01,
  328.     } ;
  329. float missile_right[] = {
  330.     3.,
  331.     3.,
  332.      MX01, MY01,-MZ02,
  333.      MX02, MY01,-MZ01,
  334.      MX03, MY02, MZ03,
  335.     3.,
  336.      MX01, MY01, MZ02,
  337.      MX01, MY01,-MZ02,
  338.      MX03, MY02, MZ03,
  339.     3.,
  340.      MX02, MY01, MZ01,
  341.      MX01, MY01, MZ02,
  342.      MX03, MY02, MZ03,
  343.     } ;
  344. float missile_left[] = {
  345.     3.,
  346.     3.,
  347.     -MX02, MY01,-MZ01,
  348.     -MX01, MY01,-MZ02,
  349.      MX03, MY02, MZ03,
  350.     3.,
  351.     -MX01, MY01,-MZ02,
  352.     -MX01, MY01, MZ02,
  353.      MX03, MY02, MZ03,
  354.     3.,
  355.     -MX01, MY01, MZ02,
  356.     -MX02, MY01, MZ01,
  357.      MX03, MY02, MZ03,
  358.     } ;
  359. float missile_back[] = {
  360.     1.,
  361.     8.,
  362.     -MX02, MY01,-MZ01,
  363.      MX02, MY01,-MZ01,
  364.     -MX01, MY01,-MZ02,
  365.      MX01, MY01,-MZ02,
  366.     -MX01, MY01, MZ02,
  367.      MX01, MY01, MZ02,
  368.     -MX02, MY01, MZ01,
  369.      MX02, MY01, MZ01,
  370.     } ;
  371.  
  372. float tank0_back_a[] = {
  373.     1.,
  374.     4.,
  375.     -QX01, QY02, QZ01,
  376.      QX01, QY02, QZ01,
  377.     -QX01, QY01, QZ03,
  378.      QX01, QY01, QZ03,
  379.     } ;
  380. float tank0_back_b[] = {
  381.     1.,
  382.     4.,
  383.     -QX01, QY01, QZ03,
  384.      QX01, QY01, QZ03,
  385.     -QX01, QY03, QZ08,
  386.      QX01, QY03, QZ08,
  387.     } ;
  388. float tank0_right[] = {
  389.     1.,
  390.     6.,
  391.      QX01, QY02, QZ01,
  392.      QX01, QY10, QZ01,
  393.      QX01, QY01, QZ03,
  394.      QX01, QY12, QZ02,
  395.      QX01, QY03, QZ08,
  396.      QX01, QY11, QZ03,
  397.     } ;
  398. float tank0_front_a[] = {
  399.     1.,
  400.     4.,
  401.     -QX01, QY10, QZ01,
  402.     -QX01, QY12, QZ02,
  403.      QX01, QY10, QZ01,
  404.      QX01, QY12, QZ02,
  405.     } ;
  406. float tank0_front_b[] = {
  407.     1.,
  408.     4.,
  409.     -QX01, QY12, QZ02,
  410.     -QX01, QY11, QZ03,
  411.      QX01, QY12, QZ02,
  412.      QX01, QY11, QZ03,
  413.     } ;
  414. float tank0_front_c[] = {
  415.     1.,
  416.     4.,
  417.     -QX01, QY03, QZ08,
  418.      QX01, QY03, QZ08,
  419.     -QX01, QY11, QZ03,
  420.      QX01, QY11, QZ03,
  421.     } ;
  422. float tank0_rpit[] = {
  423.     1.,
  424.     4.,
  425.      QX02, QY04, QZ06,
  426.      QX02, QY09, QZ04,
  427.      QX02, QY05, QZ10,
  428.      QX02, QY06, QZ09,
  429.     } ;
  430. float tank0_rbar[] = {
  431.     1.,
  432.     4.,
  433.      QX04, QY08, QZ05,
  434.      QX04, QY13, QZ05,
  435.      QX04, QY07, QZ07,
  436.      QX04, QY13, QZ07,
  437.     } ;
  438. float tank0_fpit_a[] = {
  439.     1.,
  440.     4.,
  441.     -QX02, QY05, QZ10,
  442.      QX02, QY05, QZ10,
  443.     -QX02, QY06, QZ09,
  444.      QX02, QY06, QZ09,
  445.     } ;
  446. float tank0_fpit_b[] = {
  447.     1.,
  448.     4.,
  449.        -QX02, QY09, QZ04,
  450.     -QX02, QY06, QZ09,
  451.      QX02, QY09, QZ04,
  452.      QX02, QY06, QZ09,
  453.     } ;
  454. float tank0_lpit[] = {
  455.     1.,
  456.     4.,
  457.        -QX02, QY04, QZ06,
  458.     -QX02, QY05, QZ10,
  459.     -QX02, QY09, QZ04,
  460.     -QX02, QY06, QZ09,
  461.     } ;
  462. float tank0_lbar[] = {
  463.     1.,
  464.     4.,
  465.        -QX04, QY08, QZ05,
  466.     -QX04, QY07, QZ07,
  467.     -QX04, QY13, QZ05,
  468.     -QX04, QY13, QZ07,
  469.     } ;
  470. float tank0_left[] = {
  471.     1.,
  472.     6.,
  473.     -QX01, QY12, QZ02,
  474.     -QX01, QY10, QZ01,
  475.     -QX01, QY11, QZ03,
  476.        -QX01, QY02, QZ01,
  477.     -QX01, QY03, QZ08,
  478.     -QX01, QY01, QZ03,
  479.     } ;
  480. float tank0_fbar[] = {
  481.     1.,
  482.     4.,
  483.        -QX04, QY13, QZ05,
  484.     -QX04, QY13, QZ07,
  485.      QX04, QY13, QZ05,
  486.      QX04, QY13, QZ07,
  487.     } ;
  488. float tank0_bpit[] = {
  489.     1.,
  490.     4.,
  491.        -QX02, QY04, QZ06,
  492.      QX02, QY04, QZ06,
  493.     -QX02, QY05, QZ10,
  494.      QX02, QY05, QZ10,
  495.     } ;
  496.  
  497. float tank1_back[] = {
  498.     1.,
  499.     4.,
  500.        -PX01, PY01, PZ01,
  501.      PX01, PY01, PZ01,
  502.     -PX01, PY02, PZ06,
  503.      PX01, PY02, PZ06,
  504.     } ;
  505. float tank1_right[] = {
  506.     1.,
  507.     3.,
  508.      PX01, PY02, PZ06,
  509.         PX01, PY01, PZ01,
  510.      PX01, PY08, PZ01,
  511.     } ;
  512. float tank1_front[] = {
  513.     1.,
  514.     4.,
  515.        -PX01, PY02, PZ06,
  516.      PX01, PY02, PZ06,
  517.     -PX01, PY08, PZ01,
  518.      PX01, PY08, PZ01,
  519.     } ;
  520. float tank1_rpit[] = {
  521.     1.,
  522.     3.,
  523.      PX02, PY04, PZ05,
  524.         PX02, PY03, PZ05,
  525.      PX02, PY07, PZ02,
  526.     } ;
  527. float tank1_rbar[] = {
  528.     1.,
  529.     4.,
  530.         PX04, PY06, PZ03,
  531.      PX04, PY09, PZ03,
  532.      PX04, PY05, PZ04,
  533.      PX04, PY09, PZ04,
  534.     } ;
  535. float tank1_fpit[] = {
  536.     1.,
  537.     4.,
  538.        -PX02, PY07, PZ02,
  539.     -PX02, PY04, PZ05,
  540.      PX02, PY07, PZ02,
  541.      PX02, PY04, PZ05,
  542.     } ;
  543. float tank1_lpit[] = {
  544.     1.,
  545.     3.,
  546.        -PX02, PY03, PZ05,
  547.     -PX02, PY04, PZ05,
  548.     -PX02, PY07, PZ02,
  549.     } ;
  550. float tank1_lbar[] = {
  551.     1.,
  552.     4.,
  553.        -PX04, PY06, PZ03,
  554.     -PX04, PY05, PZ04,
  555.     -PX04, PY09, PZ03,
  556.     -PX04, PY09, PZ04,
  557.     } ;
  558. float tank1_left[] = {
  559.     1.,
  560.     3.,
  561.        -PX01, PY01, PZ01,
  562.     -PX01, PY02, PZ06,
  563.     -PX01, PY08, PZ01,
  564.     } ;
  565. float tank1_fbar[] = {
  566.     1.,
  567.     4.,
  568.         PX04, PY09, PZ03,
  569.     -PX04, PY09, PZ03,
  570.      PX04, PY09, PZ04,
  571.     -PX04, PY09, PZ04,
  572.     } ;
  573.  
  574. float tank2_back[] = {
  575.     1.,
  576.     4.,
  577.        -RX01, RY01, RZ01,
  578.      RX01, RY01, RZ01,
  579.     -RX01, RY02, RZ07,
  580.      RX01, RY02, RZ07,
  581.     } ;
  582. float tank2_right[] = {
  583.     1.,
  584.     4.,
  585.      RX01, RY02, RZ07,
  586.         RX01, RY01, RZ01,
  587.      RX01, RY09, RZ02,
  588.      RX01, RY08, RZ01,
  589.     } ;
  590. float tank2_front_a[] = {
  591.     1.,
  592.     4.,
  593.        -RX01, RY09, RZ02,
  594.      RX01, RY09, RZ02,
  595.     -RX01, RY08, RZ01,
  596.      RX01, RY08, RZ01,
  597.     } ;
  598. float tank2_front_b[] = {
  599.     1.,
  600.     4.,
  601.        -RX01, RY02, RZ07,
  602.      RX01, RY02, RZ07,
  603.     -RX01, RY09, RZ02,
  604.      RX01, RY09, RZ02,
  605.     } ;
  606. float tank2_rpit[] = {
  607.     1.,
  608.     3.,
  609.         RX02, RY04, RZ06,
  610.      RX02, RY03, RZ06,
  611.      RX02, RY07, RZ03,
  612.     } ;
  613. float tank2_rbar[] = {
  614.     1.,
  615.     4.,
  616.         RX04, RY05, RZ05,
  617.      RX04, RY06, RZ04,
  618.      RX04, RY09, RZ05,
  619.      RX04, RY09, RZ04,
  620.     } ;
  621. float tank2_fpit[] = {
  622.     1.,
  623.     4.,
  624.        -RX02, RY07, RZ03,
  625.     -RX02, RY04, RZ06,
  626.      RX02, RY07, RZ03,
  627.      RX02, RY04, RZ06,
  628.     } ;
  629. float tank2_lpit[] = {
  630.     1.,
  631.     3.,
  632.        -RX02, RY04, RZ06,
  633.     -RX02, RY07, RZ03,
  634.     -RX02, RY03, RZ06,
  635.     } ;
  636. float tank2_lbar[] = {
  637.     1.,
  638.     4.,
  639.        -RX04, RY05, RZ05,
  640.     -RX04, RY09, RZ05,
  641.     -RX04, RY06, RZ04,
  642.     -RX04, RY09, RZ04,
  643.     } ;
  644. float tank2_left[] = {
  645.     1.,
  646.     4.,
  647.     -RX01, RY02, RZ07,
  648.     -RX01, RY09, RZ02,
  649.        -RX01, RY01, RZ01,
  650.     -RX01, RY08, RZ01,
  651.     } ;
  652. float tank2_fbar[] = {
  653.     1.,
  654.     4.,
  655.         RX04, RY09, RZ04,
  656.     -RX04, RY09, RZ04,
  657.      RX04, RY09, RZ05,
  658.     -RX04, RY09, RZ05,
  659.     } ;
  660.  
  661. float flag_front_top[] = {
  662.     1.,
  663.     3.,
  664.      FX01, FY01, FZ01,
  665.     -FX01, FY01, FZ01,
  666.      FX00, FY00, FZ02,
  667.     } ;
  668. float flag_front_bot[] = {
  669.     1.,
  670.     3.,
  671.      FX01, FY01, FZ01,
  672.      FX00, FY00, FZ00,
  673.     -FX01, FY01, FZ01,
  674.     } ;
  675. float flag_right_top[] = {
  676.     1.,
  677.     3.,
  678.      FX01,-FY01, FZ01,
  679.      FX01, FY01, FZ01,
  680.      FX00, FY00, FZ02,
  681.     } ;
  682. float flag_right_bot[] = {
  683.     1.,
  684.     3.,
  685.      FX01,-FY01, FZ01,
  686.      FX00, FY00, FZ00,
  687.      FX01, FY01, FZ01,
  688.     } ;
  689. float flag_left_top[] = {
  690.     1.,
  691.     3.,
  692.     -FX01, FY01, FZ01,
  693.     -FX01,-FY01, FZ01,
  694.      FX00, FY00, FZ02,
  695.     } ;
  696. float flag_left_bot[] = {
  697.     1.,
  698.     3.,
  699.     -FX01, FY01, FZ01,
  700.      FX00, FY00, FZ00,
  701.     -FX01,-FY01, FZ01,
  702.     } ;
  703. float flag_back_top[] = {
  704.     1.,
  705.     3.,
  706.     -FX01,-FY01, FZ01,
  707.      FX01,-FY01, FZ01,
  708.      FX00, FY00, FZ02,
  709.     } ;
  710. float flag_back_bot[] = {
  711.     1.,
  712.     3.,
  713.     -FX01,-FY01, FZ01,
  714.      FX00, FY00, FZ00,
  715.      FX01,-FY01, FZ01,
  716.     } ;
  717.  
  718.  
  719.  
  720. void normal3f(
  721.     float ny,
  722.     float nx,
  723.     float nz
  724.     )
  725. {
  726.     float n[3] ;
  727.  
  728.     n[0] = nx ;
  729.     n[1] = ny ;
  730.     n[2] = nz ;
  731.  
  732.     n3f( n ) ;
  733. }
  734.  
  735.  
  736.  
  737. void set_normal(
  738.     float *desc,
  739.     int stride
  740.     )
  741. {
  742.     int        i ;
  743.     int        j ;
  744.     int        k ;
  745.     float    a[3] ;
  746.     float    b[3] ;
  747.     float    n[3] ;
  748.     float    sum = 0. ;
  749.  
  750.     if( !mv_RGB ) return ;
  751.  
  752.     for( i = 0 ; i < 3 ; i++ ) {
  753.         a[i] = desc[i         ] - desc[i+stride] ;
  754.         b[i] = desc[i+2*stride] - desc[i+stride] ;
  755.         }
  756.  
  757.     for( i = 0 ; i < 3 ; i++ ) {
  758.         j = ( i + 1 ) % 3 ;
  759.         k = ( j + 1 ) % 3 ;
  760.         n[i] = a[j] * b[k] - a[k] * b[j] ;
  761.         sum += n[i] * n[i] ;
  762.         }
  763.  
  764.     if( sum > 0.0 ) {
  765.         sum = sqrtf( sum ) ;
  766.         n[0] /= sum ;
  767.         n[1] /= sum ;
  768.         n[2] /= sum ;
  769.         }
  770.     else {
  771.         fprintf( stderr, "zero normal!\n" ) ;
  772.         }
  773.  
  774.     n3f( n ) ;
  775. }
  776.  
  777.  
  778.  
  779. void draw_surface(
  780.     float *desc
  781.     )
  782. {
  783.     int n_pnts ;
  784.     int n_parts = (int)*(desc++) ;
  785.  
  786.     while( n_parts-- ) {
  787.         n_pnts = (int)*(desc++) ;
  788.         bgntmesh() ;
  789.             set_normal( desc, 3 ) ;
  790.             while( n_pnts-- ) {
  791.                 v3f( desc ) ;
  792.                 desc += 3 ;
  793.                 }
  794.         endtmesh() ;
  795.         }
  796. }
  797.  
  798.  
  799.  
  800. void draw_tex_surface(
  801.     float *desc
  802.     )
  803. {
  804.     int n_pnts ;
  805.     int n_parts = (int)*(desc++) ;
  806.  
  807.     while( n_parts-- ) {
  808.         n_pnts = (int)*(desc++) ;
  809.         bgntmesh() ;
  810.             set_normal( desc, 5 ) ;
  811.             while( n_pnts-- ) {
  812.                 if( use_textures ) t2f( &(desc[3]) ) ;
  813.                 v3f( desc ) ;
  814.                 desc += 5 ;
  815.                 }
  816.         endtmesh() ;
  817.         }
  818. }
  819.  
  820.  
  821.  
  822. void draw_dark_surface(
  823.     float *desc
  824.     )
  825. {
  826.     int n_pnts ;
  827.     int n_parts = (int)*(desc++) ;
  828.     static float n[3] = { 0., 0., 1. } ;
  829.  
  830.     while( n_parts-- ) {
  831.         n_pnts = (int)*(desc++) ;
  832.         bgntmesh() ;
  833.             if( mv_RGB ) cpack( 0x0 ) ;
  834.             while( n_pnts-- ) {
  835.                 v3f( desc ) ;
  836.                 desc += 3 ;
  837.                 }
  838.         endtmesh() ;
  839.         }
  840. }
  841.  
  842.  
  843.  
  844. void make_all( void )
  845. {
  846.     make_fonts();
  847.  
  848.     makeobj( null_obj ) ;
  849.     closeobj();
  850.  
  851.     makeobj( flag_homes = obj_count++ ) ;
  852.         color( red ) ;
  853.         rect( RED_FLAG_HOME_X - FLAG_HOME_PERIM,
  854.               RED_FLAG_HOME_Y - FLAG_HOME_PERIM,
  855.               RED_FLAG_HOME_X + FLAG_HOME_PERIM,
  856.               RED_FLAG_HOME_Y + FLAG_HOME_PERIM ) ;
  857.         color( blue ) ;
  858.         rect( BLUE_FLAG_HOME_X - FLAG_HOME_PERIM,
  859.               BLUE_FLAG_HOME_Y - FLAG_HOME_PERIM,
  860.               BLUE_FLAG_HOME_X + FLAG_HOME_PERIM,
  861.               BLUE_FLAG_HOME_Y + FLAG_HOME_PERIM ) ;
  862.     closeobj() ;
  863. }
  864.  
  865.  
  866. void make_mv_objects( void )
  867. {
  868.     make_tank() ;
  869.     make_obst() ;
  870.     make_missile() ;
  871.     make_flags() ;
  872.     make_crosshairs() ;
  873.     make_ground() ;
  874.     make_sky() ;
  875.     make_expl() ;
  876.     make_pieces( EXPDURATION ) ;
  877.  
  878.     makeobj( mv_black_clear = obj_count++ ) ;
  879.         MV_COLOR( mv_black, black ) ;
  880.         clear() ;
  881.     closeobj() ;
  882.  
  883.     makeobj( mv_guided_bg = obj_count++ ) ;
  884.         MV_COLOR( mv_red, red ) ;
  885.         sboxf( 0., mv_m, mv_w, mv_h ) ;
  886.         MV_COLOR( mv_ground_color, ground_color ) ;
  887.         sboxf( 0., 0., mv_w, mv_m ) ;
  888.     closeobj() ;
  889.  
  890.     makeobj( mv_normal_bg = obj_count++ ) ;
  891.         MV_COLOR( mv_black, black ) ;
  892.         sboxf( 0., mv_m, mv_w, mv_h ) ;
  893.         MV_COLOR( mv_ground_color, ground_color ) ;
  894.         sboxf( 0., 0., mv_w, mv_m ) ;
  895.     closeobj() ;
  896.  
  897.     makeobj( mv_set_yellow = obj_count++ ) ;
  898.         MV_COLOR( mv_yellow, yellow ) ;
  899.     closeobj() ;
  900.  
  901.     makeobj( mv_set_red = obj_count++ ) ;
  902.         MV_COLOR( mv_red, red ) ;
  903.     closeobj() ;
  904.  
  905.     makeobj( mv_set_white = obj_count++ ) ;
  906.         MV_COLOR( mv_white, white );
  907.     closeobj() ;
  908. }
  909.  
  910.  
  911.  
  912. void draw_tank(
  913.     int type,
  914.     int view,
  915.     int k,
  916.     int p
  917.     )
  918. {
  919.     int                    i ;
  920.     int                    team ;
  921.     int                    *order ;
  922.  
  923.     if( mv_RGB ) {
  924.         team = 0 ;
  925.         lmbind( MATERIAL, tankMaterial[k] ) ;
  926.         }
  927.     else {
  928.         team = k ;
  929.         }
  930.  
  931.     order = ( type ) ? order_tank_1[view] : order_tank_0[view] ;
  932.  
  933.     while( ( i = *(order++) ) != NADA ) {
  934.         switch( i ) {
  935.             case BACK:
  936.                 callobj( back[team][type] ) ;
  937.                 break;
  938.             case RIGH:
  939.                 callobj( right[team][type] ) ;
  940.                 show_logo( tank_logo[p], type, 1, tank_logo_side[p] ) ;
  941.                 break;
  942.             case FRON:
  943.                 callobj( front[team][type] ) ;
  944.                 break;
  945.             case RPIT:
  946.                 callobj( right_pit[team][type] ) ;
  947.                 break;
  948.             case RBAR:
  949.                 callobj( right_barrel[team][type] ) ;
  950.                 break;
  951.             case FPIT:
  952.                 callobj( front_pit[team][type] ) ;
  953.                 break;
  954.             case LPIT:
  955.                 callobj( left_pit[team][type] ) ;
  956.                 break;
  957.             case LBAR:
  958.                 callobj( left_barrel[team][type] ) ;
  959.                 break;
  960.             case LEFT:
  961.                 callobj( left[team][type] ) ;
  962.                 show_logo( tank_logo[p], type, 0, tank_logo_side[p] ) ;
  963.                 break;
  964.             case FBAR:
  965.                 callobj( front_barrel[team][type] ) ;
  966.                 break;
  967.             case BPIT:
  968.                 callobj( back_pit[team][type] ) ;
  969.                 break;
  970.             default :
  971.                 fprintf( stderr, "draw_tank: bad data %d\n", i ) ;
  972.                 break;
  973.             }
  974.         }
  975. }
  976.  
  977.  
  978.  
  979. void make_tank( void )
  980. {
  981.     int    team ;
  982.  
  983.     for( team = 0 ; team < ( ( mv_RGB ) ? 1 : N_TEAMS ) ; team++ ) {
  984.  
  985.         /* Tank body 0 */
  986.         makeobj( back[team][0] = obj_count++ ) ;
  987.             if( !mv_RGB ) color( t06[team] ) ;
  988.             draw_surface( tank0_back_a ) ;
  989.             if( !mv_RGB ) color( t03[team] ) ;
  990.             draw_surface( tank0_back_b ) ;
  991.         closeobj() ;
  992.  
  993.         makeobj( right[team][0] = obj_count++ ) ;
  994.             if( !mv_RGB ) color( t05[team] ) ;
  995.             draw_surface( tank0_right ) ;
  996.         closeobj() ;
  997.  
  998.         makeobj( front[team][0] = obj_count++ ) ;
  999.             if( !mv_RGB ) color( t07[team] ) ;
  1000.             draw_surface( tank0_front_a ) ;
  1001.             if( !mv_RGB ) color( t02[team] ) ;
  1002.             draw_surface( tank0_front_b ) ;
  1003.             if( !mv_RGB ) color( t00[team] ) ;
  1004.             draw_surface( tank0_front_c ) ;
  1005.         closeobj() ;
  1006.  
  1007.         makeobj( right_pit[team][0] = obj_count++ ) ;
  1008.             if( !mv_RGB ) color( t05[team] ) ;
  1009.             draw_surface( tank0_rpit ) ;
  1010.         closeobj() ;
  1011.  
  1012.         makeobj( right_barrel[team][0] = obj_count++ ) ;
  1013.             if( !mv_RGB ) color( t05[team] ) ;
  1014.             draw_surface( tank0_rbar ) ;
  1015.         closeobj() ;
  1016.  
  1017.         makeobj( front_pit[team][0] = obj_count++ ) ;
  1018.             if( !mv_RGB ) color( t00[team] ) ;
  1019.             draw_surface( tank0_fpit_a ) ;
  1020.             if( !mv_RGB ) color( t01[team] ) ;
  1021.             draw_surface( tank0_fpit_b ) ;
  1022.         closeobj() ;
  1023.  
  1024.         makeobj( left_pit[team][0] = obj_count++ ) ;
  1025.             if( !mv_RGB ) color( t05[team] ) ;
  1026.             draw_surface( tank0_lpit ) ;
  1027.         closeobj() ;
  1028.  
  1029.         makeobj( left_barrel[team][0] = obj_count++ ) ;
  1030.             if( !mv_RGB ) color( t05[team] ) ;
  1031.             draw_surface( tank0_lbar ) ;
  1032.         closeobj() ;
  1033.  
  1034.         makeobj( left[team][0] = obj_count++ ) ;
  1035.             if( !mv_RGB ) color( t05[team] ) ;
  1036.             draw_surface( tank0_left ) ;
  1037.         closeobj() ;
  1038.  
  1039.         makeobj( front_barrel[team][0] = obj_count++ ) ;
  1040.             if( !mv_RGB ) color( black ) ;
  1041.             draw_dark_surface( tank0_fbar ) ;
  1042.         closeobj() ;
  1043.  
  1044.         makeobj( back_pit[team][0] = obj_count++ ) ;
  1045.             if( !mv_RGB ) color( t01[team] ) ;
  1046.             draw_surface( tank0_bpit ) ;
  1047.         closeobj() ;
  1048.  
  1049.  
  1050.         /* Tank body 1 */
  1051.         makeobj( back[team][1] = obj_count++ ) ;
  1052.             if( !mv_RGB ) color( t04[team] ) ;
  1053.             draw_surface( tank1_back ) ;
  1054.         closeobj() ;
  1055.  
  1056.         makeobj( right[team][1] = obj_count++ ) ;
  1057.             if( !mv_RGB ) color( t06[team] ) ;
  1058.             draw_surface( tank1_right ) ;
  1059.         closeobj() ;
  1060.  
  1061.         makeobj( front[team][1] = obj_count++ ) ;
  1062.             if( !mv_RGB ) color( t00[team] ) ;
  1063.             draw_surface( tank1_front ) ;
  1064.         closeobj() ;
  1065.  
  1066.         makeobj( right_pit[team][1] = obj_count++ ) ;
  1067.             if( !mv_RGB ) color( t06[team] ) ;
  1068.             draw_surface( tank1_rpit ) ;
  1069.         closeobj() ;
  1070.  
  1071.         makeobj( right_barrel[team][1] = obj_count++ ) ;
  1072.             if( !mv_RGB ) color( t06[team] ) ;
  1073.             draw_surface( tank1_rbar ) ;
  1074.         closeobj() ;
  1075.  
  1076.         makeobj( front_pit[team][1] = obj_count++ ) ;
  1077.             if( !mv_RGB ) color( t02[team] ) ;
  1078.             draw_surface( tank1_fpit ) ;
  1079.         closeobj() ;
  1080.  
  1081.         makeobj( left_pit[team][1] = obj_count++ ) ;
  1082.             if( !mv_RGB ) color( t06[team] ) ;
  1083.             draw_surface( tank1_lpit ) ;
  1084.         closeobj() ;
  1085.  
  1086.         makeobj( left_barrel[team][1] = obj_count++ ) ;
  1087.             if( !mv_RGB ) color( t06[team] ) ;
  1088.             draw_surface( tank1_lbar ) ;
  1089.         closeobj() ;
  1090.  
  1091.         makeobj( left[team][1] = obj_count++ ) ;
  1092.             if( !mv_RGB ) color( t06[team] ) ;
  1093.             draw_surface( tank1_left ) ;
  1094.         closeobj() ;
  1095.  
  1096.         makeobj( front_barrel[team][1] = obj_count++ ) ;
  1097.             if( !mv_RGB ) color( black ) ;
  1098.             draw_dark_surface( tank1_fbar ) ;
  1099.         closeobj() ;
  1100.  
  1101.         makeobj( back_pit[team][1] = obj_count++ ) ;
  1102.         closeobj() ;
  1103.  
  1104.  
  1105.         /* Tank body 2 */
  1106.         makeobj( back[team][2] = obj_count++ ) ;
  1107.             if( !mv_RGB ) color( t04[team] ) ;
  1108.             draw_surface( tank2_back ) ;
  1109.         closeobj() ;
  1110.  
  1111.         makeobj( right[team][2] = obj_count++ ) ;
  1112.             if( !mv_RGB ) color( t06[team] ) ;
  1113.             draw_surface( tank2_right ) ;
  1114.         closeobj() ;
  1115.  
  1116.         makeobj( front[team][2] = obj_count++ ) ;
  1117.             if( !mv_RGB ) color( t07[team] ) ;
  1118.             draw_surface( tank2_front_a ) ;
  1119.             if( !mv_RGB ) color( t00[team] ) ;
  1120.             draw_surface( tank2_front_b ) ;
  1121.         closeobj() ;
  1122.  
  1123.         makeobj( right_pit[team][2] = obj_count++ ) ;
  1124.             if( !mv_RGB ) color( t06[team] ) ;
  1125.             draw_surface( tank2_rpit ) ;
  1126.         closeobj() ;
  1127.  
  1128.         makeobj( right_barrel[team][2] = obj_count++ ) ;
  1129.             if( !mv_RGB ) color( t06[team] ) ;
  1130.             draw_surface( tank2_rbar ) ;
  1131.         closeobj() ;
  1132.  
  1133.         makeobj( front_pit[team][2] = obj_count++ ) ;
  1134.             if( !mv_RGB ) color( t02[team] ) ;
  1135.             draw_surface( tank2_fpit ) ;
  1136.         closeobj() ;
  1137.  
  1138.         makeobj( left_pit[team][2] = obj_count++ ) ;
  1139.             if( !mv_RGB ) color( t06[team] ) ;
  1140.             draw_surface( tank2_lpit ) ;
  1141.         closeobj() ;
  1142.  
  1143.         makeobj( left_barrel[team][2] = obj_count++ ) ;
  1144.             if( !mv_RGB ) color( t06[team] ) ;
  1145.             draw_surface( tank2_lbar ) ;
  1146.         closeobj() ;
  1147.  
  1148.         makeobj( left[team][2] = obj_count++ ) ;
  1149.             if( !mv_RGB ) color( t06[team] ) ;
  1150.             draw_surface( tank2_left ) ;
  1151.         closeobj() ;
  1152.  
  1153.         makeobj( front_barrel[team][2] = obj_count++ ) ;
  1154.             if( !mv_RGB ) color( black ) ;
  1155.             draw_dark_surface( tank2_fbar ) ;
  1156.         closeobj() ;
  1157.  
  1158.         makeobj( back_pit[team][2] = obj_count++ ) ;
  1159.         closeobj() ;
  1160.         }
  1161. }
  1162.  
  1163.  
  1164.  
  1165. void make_missile( void )
  1166. {
  1167.     int                    i ;
  1168.     int                    v ;
  1169.  
  1170.     for( v = 0 ; v < N_VIEWS ; v++ ) {
  1171.         makeobj( missile[v] = obj_count++ ) ;
  1172.             if( mv_RGB )
  1173.                 lmbind( MATERIAL, MISSILE_MATERIAL ) ;
  1174.             pushmatrix() ;
  1175.             translate( 0., 0., (QZ05 + QZ07) / 2. ) ;
  1176.             for( i = 0 ; i < 4 ; i++ ) {
  1177.                 switch( order_missile[v][i] ) {
  1178.                     case FRON:
  1179.                         if( !mv_RGB ) color( m00 ) ;
  1180.                         draw_surface( missile_front_a ) ;
  1181.                         if( !mv_RGB ) color( m03 ) ;
  1182.                         draw_surface( missile_front_b ) ;
  1183.                         break;
  1184.                     case RIGH:
  1185.                         if( !mv_RGB ) color( m01 ) ;
  1186.                         draw_surface( missile_right ) ;
  1187.                         break;
  1188.                     case LEFT:
  1189.                         if( !mv_RGB ) color( m01 ) ;
  1190.                         draw_surface( missile_left ) ;
  1191.                         break;
  1192.                     case BACK:
  1193.                         if( !mv_RGB ) color( m02 ) ;
  1194.                         draw_surface( missile_back ) ;
  1195.                         break;
  1196.                     case NADA:
  1197.                         break;
  1198.                     }
  1199.                 }
  1200.             popmatrix() ;
  1201.         closeobj();
  1202.         }
  1203. }
  1204.  
  1205.  
  1206.  
  1207. void make_crosshairs( void )
  1208. {
  1209.     int                    cxmid ;
  1210.     int                    cymid ;
  1211.     int                    cxdel ;
  1212.     float                p[2] ;
  1213.  
  1214.     cxmid = ( VPMVIEW_R - VPMVIEW_L ) / 2 ;
  1215.     cymid = ( VPMVIEW_T - VPMVIEW_B ) / 2 ;
  1216.     cxdel = ( VPMVIEW_R - VPMVIEW_L ) / 200 ;
  1217.  
  1218.     makeobj( crosshairs = obj_count++ ) ;
  1219.         pushmatrix();
  1220.         loadmatrix( id_mat ) ;
  1221.         ortho2( 0., FVPMVIEW_R - FVPMVIEW_L, 0., FVPMVIEW_T - FVPMVIEW_B ) ;
  1222.         MV_COLOR( mv_yellow, yellow );
  1223.         bgnline() ;
  1224.             p[0] = (float)cxmid-cxdel ;
  1225.             p[1] = (float)cymid ;
  1226.             v2f( p ) ;
  1227.             p[0] = (float)cxmid+cxdel ;
  1228.             v2f( p ) ;
  1229.         endline() ;
  1230.         bgnline() ;
  1231.             p[0] = (float)cxmid ;
  1232.             p[1] = (float)cymid-cxdel ;
  1233.             v2f( p ) ;
  1234.             p[1] = (float)cymid+cxdel ;
  1235.             v2f( p ) ;
  1236.         endline() ;
  1237.         if( view_only )
  1238.             circ( (float)cxmid, (float)cymid, VIEW_ONLY_TRACK_RADIUS ) ;
  1239.         else
  1240.             circ( (float)cxmid, (float)cymid, NORMAL_TRACK_RADIUS ) ;
  1241.         popmatrix();
  1242.     closeobj() ;
  1243. }
  1244.  
  1245.  
  1246. void make_radar( void )
  1247. {
  1248.     makeobj( radar1 = obj_count++ ) ;
  1249.         color( grey ) ;
  1250.         clear() ;
  1251.         color( 0 ) ;
  1252.         circf( 0., 0., GM_DURATN * GM_VEL / 10. ) ;
  1253.     closeobj() ;
  1254. }
  1255.  
  1256.  
  1257. void make_ground( void )
  1258. {
  1259.     float                pt[2] ;
  1260.     float                i ;
  1261.     float                j ;
  1262.  
  1263.     makeobj( ground = obj_count++ ) ;
  1264.         MV_COLOR( 0x00000000, black ) ;
  1265.         bgnpoint() ;
  1266.             for(i = -750. ; i <= 750. ; i+=50. ) {
  1267.                 pt[0] = i ;
  1268.                 for(j = -750. ; j <= 750. ; j+=50. ) {
  1269.                     pt[1] = j ;
  1270.                     v2f( pt ) ;
  1271.                     }
  1272.                 }
  1273.         endpoint() ;
  1274.     closeobj();
  1275.  
  1276.     makeobj( border = obj_count++ ) ;
  1277.         rect( -FIELD_SIZE, -FIELD_SIZE, FIELD_SIZE, FIELD_SIZE ) ;
  1278.     closeobj() ;
  1279.  
  1280.     makeobj( flag_homes_mv = obj_count++ ) ;
  1281.         MV_COLOR( 0x000000ff, red ) ;
  1282.         rect( RED_FLAG_HOME_X - FLAG_HOME_PERIM,
  1283.               RED_FLAG_HOME_Y - FLAG_HOME_PERIM,
  1284.               RED_FLAG_HOME_X + FLAG_HOME_PERIM,
  1285.               RED_FLAG_HOME_Y + FLAG_HOME_PERIM ) ;
  1286.         MV_COLOR( 0x00ff0000, blue ) ;
  1287.         rect( BLUE_FLAG_HOME_X - FLAG_HOME_PERIM,
  1288.               BLUE_FLAG_HOME_Y - FLAG_HOME_PERIM,
  1289.               BLUE_FLAG_HOME_X + FLAG_HOME_PERIM,
  1290.               BLUE_FLAG_HOME_Y + FLAG_HOME_PERIM ) ;
  1291.     closeobj() ;
  1292. }
  1293.  
  1294.  
  1295. void make_sky( void )
  1296. {
  1297.     int                    i ;
  1298.     Angle                phi ;
  1299.     Angle                theta ;
  1300.     float                xyz[3] ;
  1301.  
  1302.     makeobj( sky = obj_count++ ) ;
  1303.         MV_COLOR( mv_white, white );
  1304.         for( i = 0 ; i < 1000 ; i++ ) {
  1305.             phi   = ( rand() % 50 ) ;
  1306.             theta = ( rand() % 3600 ) ;
  1307.             xyz[0] = 1000. * COSINE( phi ) * COSINE( theta ) ;
  1308.             xyz[1] = 1000. * COSINE( phi ) * SINE( theta ) ;
  1309.             xyz[2] = 1000. * SINE( phi ) ;
  1310.             if( i < 50 ) {
  1311.                 cmov( xyz[0], xyz[1], xyz[2] ) ;
  1312.                 charstr( "." ) ;
  1313.                 }
  1314.             else {
  1315.                 if( i == 50 )
  1316.                     bgnpoint() ;
  1317.                 v3f( xyz ) ;
  1318.                 }
  1319.             }
  1320.         endpoint() ;
  1321.     closeobj();
  1322. }
  1323.  
  1324.  
  1325.  
  1326. static void draw_tcirc(
  1327.     float x,
  1328.     float y,
  1329.     float r,
  1330.     int steps,
  1331.     int clip,
  1332.     int show_norms,
  1333.     float a
  1334.     )
  1335. {
  1336.     int        i ;
  1337.     float    ang ;
  1338.     float    v[3] ;
  1339.     float    denom = steps / 2 ;
  1340.     float    rad ;
  1341.  
  1342.     bgntmesh() ;
  1343.         if( show_norms )
  1344.             normal3f( fsin( a )*fcos( 0. ), fsin( a )*fsin( 0. ), fcos( a ) ) ;
  1345.         v[0] = x + r ;
  1346.         v[1] = y + 0. ;
  1347.         v[2] = 0. ;
  1348.         v2f( v ) ;
  1349.         if( show_norms )
  1350.             normal3f( 0., 0., 1. ) ;
  1351.         v[0] = x + 0. ;
  1352.         v[1] = y + 0. ;
  1353.         v[2] = 0. ;
  1354.         v2f( v ) ;
  1355.         for( i = 1 ; i <= steps ; i++ ) {
  1356.             ang = i / denom * M_PI ;
  1357.             if( clip ) {
  1358.                 rad = r * ( 1.0 + ( rand() % 11 - 5.0 ) * 0.01 ) ;
  1359.                 }
  1360.             else {
  1361.                 rad = r ;
  1362.                 }
  1363.             v[0] = x + rad * fcos( ang ) ;
  1364.             v[1] = y + rad * fsin( ang ) ;
  1365.             v[2] = 0. ;
  1366.             if( clip && v[1] < -DROP ) {
  1367.                 /*
  1368.                  * Hack to make explosion look 3D.
  1369.                  */
  1370.                 v[2] = ( -DROP - v[1] ) * -fsin( ang ) ;
  1371.                 v[1] = -DROP ;
  1372.                 }
  1373.             if( show_norms )
  1374.                 normal3f( fsin( a )*fcos( ang ), fsin( a )*fsin( ang ),
  1375.                           fcos( a ) ) ;
  1376.             v3f( v ) ;
  1377.             swaptmesh() ;
  1378.             }
  1379.     endtmesh() ;
  1380. }
  1381.  
  1382.  
  1383.  
  1384. static float    expl_c[][3] = {
  1385.     { 1.00, 1.00, 0.00 },
  1386.     { 1.00, 0.25, 0.00 },
  1387.     { 0.65, 0.00, 0.00 },
  1388.     { 0.25, 0.00, 0.00 },
  1389.     { 0.00, 0.00, 0.00 },
  1390.     } ;
  1391.  
  1392. void make_expl( void )
  1393. {
  1394.     int                        i ;
  1395.     int                        lo ;
  1396.     int                        hi ;
  1397.     float                    f ;
  1398.     float                    r ;
  1399.     float                    c[4] ;
  1400.  
  1401.     for( i = 0 ; i < MEXPL_DURATION ; i++ ) {
  1402.         makeobj( msl_expl[i] = obj_count++ ) ;
  1403.             r = 16. * fsin( ( ( i + 2. ) / MEXPL_DURATION ) * M_PI_2 ) ;
  1404.             if( mv_RGB ) {
  1405.                 f = (float)i / ( MEXPL_DURATION - 1. ) ;
  1406.                 f *= sizeof( expl_c ) / sizeof( expl_c[0] ) - 1 ;
  1407.                 lo = (int)ffloor( f ) ;
  1408.                 hi = (int)fceil( f ) ;
  1409.                 f -= lo ;
  1410.                 c[0] = expl_c[lo][0] + f*( expl_c[hi][0] - expl_c[lo][0] ) ;
  1411.                 c[1] = expl_c[lo][1] + f*( expl_c[hi][1] - expl_c[lo][1] ) ;
  1412.                 c[2] = expl_c[lo][2] + f*( expl_c[hi][2] - expl_c[lo][2] ) ;
  1413.                 if( transparentExplosion ) {
  1414.                     c[3] = sqrt( 1. - (float)i / ( MEXPL_DURATION - 1. ) ) ;
  1415.                     c4f( c ) ;
  1416.                     }
  1417.                 else {
  1418.                     c3f( c ) ;
  1419.                     }
  1420.                 }
  1421.             else {
  1422.                 color( red );
  1423.                 }
  1424.             pushmatrix() ;
  1425.             translate( 0., 0., DROP ) ;
  1426.             rotate( 900, 'x' ) ;
  1427.             if( transparentExplosion )
  1428.                 blendfunction( BF_SA, BF_MSA ) ;
  1429.             else
  1430.                 setpattern( 1 ) ;
  1431.             draw_tcirc( 0., 0., r, 30, 1, 0, 0. ) ;
  1432.             if( transparentExplosion )
  1433.                 blendfunction( BF_ONE, BF_ZERO ) ;
  1434.             else
  1435.                 setpattern( 0 ) ;
  1436.             popmatrix() ;
  1437.         closeobj();
  1438.         }
  1439. }
  1440.  
  1441.  
  1442.  
  1443. void init_overlay_color(
  1444.     Widget w
  1445.     )
  1446. {
  1447.     int                n ;
  1448.     Arg                args[5] ;
  1449.     Colormap        cmap ;
  1450.     Window            wndw ;
  1451.     XVisualInfo        *visualInfo ;
  1452.  
  1453.     grey = 1 ;
  1454.  
  1455.     n = 0 ;
  1456.     XtSetArg( args[n], ( use_pups ) ? GlxNpopupVisual : GlxNoverlayVisual,
  1457.                 &visualInfo ) ; n++ ;
  1458.     XtSetArg( args[n], ( use_pups ) ? GlxNpopupWindow : GlxNoverlayWindow,
  1459.                 &wndw ) ; n++ ;
  1460.     XtSetArg( args[n], ( use_pups ) ? GlxNpopupColormap : GlxNoverlayColormap,
  1461.                 &cmap ) ; n++ ;
  1462.     XtGetValues( w, args, n ) ;
  1463.  
  1464. /*
  1465.  * The following gives a BadAlloc error, so skip for now.  It works anyway
  1466.  * without creating a new map (as of 4.0.3)....
  1467.  *
  1468.     cmap = XCreateColormap( XtDisplay( w ), wndw, visualInfo->visual,
  1469.                             AllocNone ) ;
  1470.     n = 0 ;
  1471.     XtSetArg( args[n], ( use_pups ) ? GlxNpopupColormap : GlxNoverlayColormap,
  1472.                 cmap ) ; n++ ;
  1473.     XtSetValues( w, args, n ) ;
  1474. */
  1475.  
  1476.     set_mapcolor( cmap, grey, 120, 120, 120 ) ;
  1477.     set_mapcolor( cmap,    2, 255, 255,   0 ) ;
  1478. }
  1479.  
  1480.  
  1481.  
  1482. float ObstacleMaterial[] = {
  1483.     AMBIENT,   0.065, 0.038, 0.025,
  1484.     DIFFUSE,   0.650, 0.380, 0.250,
  1485.     SPECULAR,  0.100, 0.100, 0.100,
  1486.     SHININESS, 0.0,
  1487.     LMNULL } ;
  1488.  
  1489. float GreenTankMaterial[] = {
  1490.     AMBIENT,   0.012, 0.062, 0.018,
  1491.     DIFFUSE,   0.120, 0.620, 0.180,
  1492.     SPECULAR,  0.093, 0.080, 0.064,
  1493.     SHININESS, 10,
  1494.     LMNULL } ;
  1495.  
  1496. float BlueTankMaterial[] = {
  1497.     AMBIENT,   0.000, 0.038, 0.100,
  1498.     DIFFUSE,   0.000, 0.380, 1.000,
  1499.     SPECULAR,  0.000, 0.076, 0.200,
  1500.     SHININESS, 10,
  1501.     LMNULL } ;
  1502.  
  1503. float RedTankMaterial[] = {
  1504.     AMBIENT,   0.100, 0.010, 0.010,
  1505.     DIFFUSE,   1.000, 0.100, 0.100,
  1506.     SPECULAR,  0.200, 0.020, 0.020,
  1507.     SHININESS, 10,
  1508.     LMNULL } ;
  1509.  
  1510. float MissileMaterial[] = {
  1511.     AMBIENT,   0.561, 0.480, 0.387,
  1512.     DIFFUSE,   0.500, 0.500, 0.500,
  1513.     SPECULAR,  0.500, 0.500, 0.500,
  1514.     SHININESS, 40,
  1515.     LMNULL } ;
  1516.  
  1517. float ManMaterial[] = {
  1518.     AMBIENT,   0.100, 0.100, 0.100,
  1519.     DIFFUSE,   0.500, 0.500, 0.500,
  1520.     SPECULAR,  0.100, 0.100, 0.100,
  1521.     SHININESS, 0,
  1522.     LMNULL } ;
  1523.  
  1524. float BlackMaterial[] = {
  1525.     AMBIENT,   0.000, 0.000, 0.000,
  1526.     DIFFUSE,   0.000, 0.000, 0.000,
  1527.     SPECULAR,  0.000, 0.000, 0.000,
  1528.     SHININESS, 0,
  1529.     LMNULL } ;
  1530.  
  1531. /*
  1532.     POSITION, 0.866, 0.000, 0.500, 0.000,
  1533.     POSITION, 0.000, 1.000, 0.000, 0.000,    South
  1534.     POSITION, 0.000,-1.000, 0.000, 0.000,    North
  1535.     POSITION, 0.000, 0.000,-1.000, 0.000,    Above
  1536.     POSITION, 1.000, 0.000, 0.000, 0.000,    West
  1537.     POSITION,-1.000, 0.000, 0.000, 0.000,    East
  1538. */
  1539.  
  1540. float Light1[] = {
  1541.     LCOLOR,   1.000, 1.000, 1.000,
  1542.     POSITION, 0.612, 0.353,-0.707, 0.000,
  1543.     AMBIENT,  0.300, 0.300, 0.300,
  1544.     LMNULL } ;
  1545. float Light2[] = {
  1546.     LCOLOR,   1.000, 1.000, 1.000,
  1547.     POSITION,-0.300,-0.640,-0.707, 0.000,
  1548.     AMBIENT,  0.300, 0.300, 0.300,
  1549.     LMNULL } ;
  1550.  
  1551. float LModel[] = {
  1552.     AMBIENT, .2, .2, .2,
  1553.     LOCALVIEWER, 0.0,
  1554.     LMNULL } ;
  1555.  
  1556.  
  1557. void init_lighting( void )
  1558. {
  1559.     lmdef( DEFMATERIAL, OBSTACLE_MATERIAL,  0, ObstacleMaterial ) ;
  1560.     lmdef( DEFMATERIAL, GREEN_TANK_MATERIAL,  0, GreenTankMaterial ) ;
  1561.     lmdef( DEFMATERIAL, BLUE_TANK_MATERIAL,  0, BlueTankMaterial ) ;
  1562.     lmdef( DEFMATERIAL, RED_TANK_MATERIAL,  0, RedTankMaterial ) ;
  1563.     lmdef( DEFMATERIAL, MISSILE_MATERIAL,  0, MissileMaterial ) ;
  1564.     lmdef( DEFMATERIAL, MAN_MATERIAL,  0, ManMaterial ) ;
  1565.     lmdef( DEFLIGHT, 1, 0, Light1 ) ;
  1566.     lmdef( DEFLIGHT, 2, 0, Light2 ) ;
  1567.     lmdef( DEFLMODEL, 1, 0, LModel ) ;
  1568.  
  1569.     makeobj( lights_on = obj_count++ ) ;
  1570.         lmbind( LIGHT0, 1 ) ;
  1571.         lmbind( LIGHT1, 2 ) ;
  1572.     closeobj() ;
  1573.  
  1574.     makeobj( lights_off = obj_count++ ) ;
  1575.         lmbind( LIGHT0, 0 ) ;
  1576.         lmbind( LIGHT1, 0 ) ;
  1577.     closeobj() ;
  1578. }
  1579.  
  1580.  
  1581.  
  1582. void bind_lighting( void )
  1583. {
  1584.     lmbind( LMODEL, 1 ) ;
  1585. }
  1586.  
  1587.  
  1588.  
  1589. static void set_mapcolor(
  1590.     Colormap cmap,
  1591.     unsigned long i,
  1592.     unsigned short r,
  1593.     unsigned short g,
  1594.     unsigned short b
  1595.     )
  1596. {
  1597.     XColor            c ;
  1598.     int                st ;
  1599.  
  1600.     c.pixel = i ;
  1601.     c.red = r << 8 ;
  1602.     c.green = g << 8 ;
  1603.     c.blue = b << 8 ;
  1604.     c.flags = DoRed | DoGreen | DoBlue ;
  1605.     st = XStoreColor( display, cmap, &c ) ;
  1606. }
  1607.  
  1608.  
  1609.  
  1610. void init_color(
  1611.     int map,
  1612.     Widget widget
  1613.     )
  1614. {
  1615.     int                db_bits ;
  1616.     Colormap        cmap ;
  1617.     int                n ;
  1618.     Arg                args[5] ;
  1619.     XVisualInfo        *visualInfo ;
  1620.  
  1621.     n = 0 ;
  1622.     XtSetArg( args[n], XtNvisual, &visualInfo ) ; n++ ;
  1623.     XtGetValues( widget, args, n ) ;
  1624.  
  1625. /*
  1626. printf( "vid = 0x%08x, depth = %d, class = %d, colormapsize = %d, bpr = %d\n", visualInfo->visualid, visualInfo->depth, visualInfo->class, visualInfo->colormap_size, visualInfo->bits_per_rgb ) ;
  1627. printf( "map = %d\n", map ) ;
  1628. printf( "mvRGBmode: %d\n", mv_RGB ) ;
  1629. */
  1630.  
  1631.     if( map == MAIN_VIEW_MAP && mv_RGB ) {
  1632.         mv_black  = 0x00000000 ;
  1633.         mv_red    = 0x000000ff ;
  1634.         mv_green  = 0x0000ff00 ;
  1635.         mv_yellow = 0x0000ffff ;
  1636.         mv_white  = 0x00ffffff ;
  1637.         mv_ground_color = 0x006c90ba ;
  1638.         tankMaterial[NEUTRAL_TEAM] = GREEN_TANK_MATERIAL ;
  1639.         tankMaterial[RED_TEAM]     = RED_TANK_MATERIAL ;
  1640.         tankMaterial[BLUE_TEAM]    = BLUE_TANK_MATERIAL ;
  1641.         return ;
  1642.         }
  1643.  
  1644.     if( visualInfo->class != TrueColor ) {
  1645.         cmap = XCreateColormap( XtDisplay( toplevel ), XtWindow( widget ),
  1646.                                 visualInfo->visual, AllocAll ) ;
  1647.         n = 0 ;
  1648.         XtSetArg( args[n], XtNcolormap, cmap ) ; n++ ;
  1649.         XtSetValues( widget, args, n ) ;
  1650.         }
  1651.  
  1652.     db_bits = getgdesc( GD_BITS_NORM_DBL_CMODE ) ;
  1653. #if defined(INDIGO)
  1654.     db_bits = 4 ;
  1655. #endif /* defined(INDIGO) */
  1656.  
  1657.     /*
  1658.      * If main view is in RGB mode, we only need the following colors:
  1659.      *        green, red, blue, yellow, black, red, and ramp colors.
  1660.      */
  1661.     if( mv_RGB ) {
  1662.         black    = 0 ;
  1663.         red        = 1 ;
  1664.         green    = 2 ;
  1665.         yellow    = 3 ;
  1666.         blue    = 6 ;
  1667.         white    = 7 ;
  1668.         ground_color = 12 ;
  1669.         set_mapcolor( cmap,  black,   0,   0,   0 ) ;
  1670.         set_mapcolor( cmap,    red, 255,   0,   0 ) ;
  1671.         set_mapcolor( cmap,  green,   0, 255,   0 ) ;
  1672.         set_mapcolor( cmap, yellow, 255, 255,   0 ) ;
  1673.         set_mapcolor( cmap,   blue,   0, 128, 255 ) ;
  1674.         set_mapcolor( cmap,  white, 255, 255, 255 ) ;
  1675.         set_mapcolor( cmap, ground_color, 186, 131,  85 ) ;
  1676.         }
  1677.     else {
  1678.         /*
  1679.          * Colors to be used by main view.
  1680.          */
  1681.         if( db_bits < 8 ) {
  1682.             t00[NEUTRAL_TEAM] = 1 ;
  1683.             t01[NEUTRAL_TEAM] = t00[NEUTRAL_TEAM] ;
  1684.             t02[NEUTRAL_TEAM] = 2 ;
  1685.             t03[NEUTRAL_TEAM] = t02[NEUTRAL_TEAM] ;
  1686.             t04[NEUTRAL_TEAM] = t02[NEUTRAL_TEAM] ;
  1687.             t05[NEUTRAL_TEAM] = t02[NEUTRAL_TEAM] ;
  1688.             t06[NEUTRAL_TEAM] = 3 ;
  1689.             t07[NEUTRAL_TEAM] = t06[NEUTRAL_TEAM] ;
  1690.  
  1691.             t00[RED_TEAM] = 5 ;
  1692.             t01[RED_TEAM] = t00[RED_TEAM] ;
  1693.             t02[RED_TEAM] = 6 ;
  1694.             t03[RED_TEAM] = t02[RED_TEAM] ;
  1695.             t04[RED_TEAM] = t02[RED_TEAM] ;
  1696.             t05[RED_TEAM] = t02[RED_TEAM] ;
  1697.             t06[RED_TEAM] = 7 ;
  1698.             t07[RED_TEAM] = t06[RED_TEAM] ;
  1699.  
  1700.             t00[BLUE_TEAM] = 9 ;
  1701.             t01[BLUE_TEAM] = t00[BLUE_TEAM] ;
  1702.             t02[BLUE_TEAM] = 10 ;
  1703.             t03[BLUE_TEAM] = t02[BLUE_TEAM] ;
  1704.             t04[BLUE_TEAM] = t02[BLUE_TEAM] ;
  1705.             t05[BLUE_TEAM] = t02[BLUE_TEAM] ;
  1706.             t06[BLUE_TEAM] = 11 ;
  1707.             t07[BLUE_TEAM] = t06[BLUE_TEAM] ;
  1708.  
  1709.             set_mapcolor( cmap, t00[NEUTRAL_TEAM],  31, 158,  46 ) ;
  1710.             set_mapcolor( cmap, t02[NEUTRAL_TEAM],  25, 127,  38 ) ;
  1711.             set_mapcolor( cmap, t06[NEUTRAL_TEAM],  18,  92,  27 ) ;
  1712.  
  1713.             set_mapcolor( cmap, t00[RED_TEAM],   181,  18,   0 ) ;
  1714.             set_mapcolor( cmap, t02[RED_TEAM],   135,  14,   0 ) ;
  1715.             set_mapcolor( cmap, t06[RED_TEAM],    90,   9,   0 ) ;
  1716.  
  1717.             set_mapcolor( cmap, t00[BLUE_TEAM],    0,  96, 255 ) ;
  1718.             set_mapcolor( cmap, t02[BLUE_TEAM],    0,  68, 181 ) ;
  1719.             set_mapcolor( cmap, t06[BLUE_TEAM],    0,  40, 107 ) ;
  1720.  
  1721.             o00 = 13 ;
  1722.             o01 = 14 ;
  1723.             o02 = o01 ;
  1724.             o03 = o00 ;
  1725.             o04 = o00 ;
  1726.             o05 = o01 ;
  1727.             o06 = o01 ;
  1728.             o07 = o00 ;
  1729.             set_mapcolor( cmap, o00,  68,  34,  26 ) ;
  1730.             set_mapcolor( cmap, o01, 128,  76,  51 ) ;
  1731.  
  1732.             m00 = t06[NEUTRAL_TEAM] ;
  1733.             m01 = t02[NEUTRAL_TEAM] ;
  1734.             m02 = t01[NEUTRAL_TEAM] ;
  1735.             m03 = m00 ;
  1736.  
  1737.             black         = 0 ;
  1738.             yellow         = 4 ;
  1739.             white         = 8 ;
  1740.             red             = 15 ;
  1741.             ground_color = 12 ;
  1742.             set_mapcolor( cmap,        black,   0,   0,   0 ) ;
  1743.             set_mapcolor( cmap,          red, 255,   0,   0 ) ;
  1744.             set_mapcolor( cmap,       yellow, 255, 255,   0 ) ;
  1745.             set_mapcolor( cmap,        white, 255, 255, 255 ) ;
  1746.             set_mapcolor( cmap, ground_color, 186, 131,  85 ) ;
  1747.             }
  1748.         else {
  1749.             t00[NEUTRAL_TEAM] = 16 ;
  1750.             t01[NEUTRAL_TEAM] = 17 ;
  1751.             t02[NEUTRAL_TEAM] = 18 ;
  1752.             t03[NEUTRAL_TEAM] = 19 ;
  1753.             t04[NEUTRAL_TEAM] = 20 ;
  1754.             t05[NEUTRAL_TEAM] = 21 ;
  1755.             t06[NEUTRAL_TEAM] = 22 ;
  1756.             t07[NEUTRAL_TEAM] = 23 ;
  1757.  
  1758.             set_mapcolor( cmap, t00[NEUTRAL_TEAM],  31, 158,  46 ) ;
  1759.             set_mapcolor( cmap, t01[NEUTRAL_TEAM],  28, 143,  42 ) ;
  1760.             set_mapcolor( cmap, t02[NEUTRAL_TEAM],  25, 127,  38 ) ;
  1761.             set_mapcolor( cmap, t03[NEUTRAL_TEAM],  24, 122,  36 ) ;
  1762.             set_mapcolor( cmap, t04[NEUTRAL_TEAM],  22, 112,  33 ) ;
  1763.             set_mapcolor( cmap, t05[NEUTRAL_TEAM],  20, 102,  31 ) ;
  1764.             set_mapcolor( cmap, t06[NEUTRAL_TEAM],  18,  92,  27 ) ;
  1765.             set_mapcolor( cmap, t07[NEUTRAL_TEAM],  15,  76,  23 ) ;
  1766.  
  1767.             t00[RED_TEAM] = 32 ;
  1768.             t01[RED_TEAM] = 33 ;
  1769.             t02[RED_TEAM] = 34 ;
  1770.             t03[RED_TEAM] = 35 ;
  1771.             t04[RED_TEAM] = 36 ;
  1772.             t05[RED_TEAM] = 37 ;
  1773.             t06[RED_TEAM] = 38 ;
  1774.             t07[RED_TEAM] = 39 ;
  1775.  
  1776.             set_mapcolor( cmap, t00[RED_TEAM],   181,  18,   0 ) ;
  1777.             set_mapcolor( cmap, t01[RED_TEAM],   158,  16,   0 ) ;
  1778.             set_mapcolor( cmap, t02[RED_TEAM],   135,  14,   0 ) ;
  1779.             set_mapcolor( cmap, t03[RED_TEAM],   125,  12,   0 ) ;
  1780.             set_mapcolor( cmap, t04[RED_TEAM],   115,  11,   0 ) ;
  1781.             set_mapcolor( cmap, t05[RED_TEAM],   102,  10,   0 ) ;
  1782.             set_mapcolor( cmap, t06[RED_TEAM],    90,   9,   0 ) ;
  1783.             set_mapcolor( cmap, t07[RED_TEAM],    58,   6,   0 ) ;
  1784.  
  1785.             t00[BLUE_TEAM] = 48 ;
  1786.             t01[BLUE_TEAM] = 49 ;
  1787.             t02[BLUE_TEAM] = 50 ;
  1788.             t03[BLUE_TEAM] = 51 ;
  1789.             t04[BLUE_TEAM] = 52 ;
  1790.             t05[BLUE_TEAM] = 53 ;
  1791.             t06[BLUE_TEAM] = 54 ;
  1792.             t07[BLUE_TEAM] = 55 ;
  1793.             set_mapcolor( cmap, t00[BLUE_TEAM],    0,  96, 255 ) ;
  1794.             set_mapcolor( cmap, t01[BLUE_TEAM],    0,  82, 218 ) ;
  1795.             set_mapcolor( cmap, t02[BLUE_TEAM],    0,  68, 181 ) ;
  1796.             set_mapcolor( cmap, t03[BLUE_TEAM],    0,  61, 162 ) ;
  1797.             set_mapcolor( cmap, t04[BLUE_TEAM],    0,  54, 144 ) ;
  1798.             set_mapcolor( cmap, t05[BLUE_TEAM],    0,  47, 125 ) ;
  1799.             set_mapcolor( cmap, t06[BLUE_TEAM],    0,  40, 107 ) ;
  1800.             set_mapcolor( cmap, t07[BLUE_TEAM],    0,  28,  74 ) ;
  1801.  
  1802.             o00 = 24 ;
  1803.             o01 = 25 ;
  1804.             o02 = 26 ;
  1805.             o03 = 27 ;
  1806.             o04 = 28 ;
  1807.             o05 = 29 ;
  1808.             o06 = 30 ;
  1809.             o07 = 31 ;
  1810.             set_mapcolor( cmap, o00,  68,  34,  26 ) ;
  1811.             set_mapcolor( cmap, o01, 128,  76,  51 ) ;
  1812.             set_mapcolor( cmap, o02, 128,  76,  51 ) ;
  1813.             set_mapcolor( cmap, o03,  68,  34,  26 ) ;
  1814.             set_mapcolor( cmap, o04, 119,  68,  51 ) ;
  1815.             set_mapcolor( cmap, o05, 170,  94,  60 ) ;
  1816.             set_mapcolor( cmap, o06, 170,  94,  60 ) ;
  1817.             set_mapcolor( cmap, o07, 119,  68,  51 ) ;
  1818.  
  1819.             m00 = 40 ;
  1820.             m01 = 41 ;
  1821.             m02 = 42 ;
  1822.             m03 = 43 ;
  1823.             set_mapcolor( cmap, m00, 225, 225, 225 ) ;
  1824.             set_mapcolor( cmap, m01, 175, 175, 175 ) ;
  1825.             set_mapcolor( cmap, m02, 125, 125, 125 ) ;
  1826.             set_mapcolor( cmap, m03, 100, 100, 100 ) ;
  1827.  
  1828.             black         = 0 ;
  1829.             yellow         = 3 ;
  1830.             white         = 7 ;
  1831.             red             = 1 ;
  1832.             ground_color = 44 ;
  1833.             set_mapcolor( cmap,        black,   0,   0,   0 ) ;
  1834.             set_mapcolor( cmap,          red, 255,   0,   0 ) ;
  1835.             set_mapcolor( cmap,       yellow, 255, 255,   0 ) ;
  1836.             set_mapcolor( cmap,        white, 255, 255, 255 ) ;
  1837.             set_mapcolor( cmap, ground_color, 186, 131,  85 ) ;
  1838.             }
  1839.         /*
  1840.          * Remaining colors to be used by base view and radar view.
  1841.          */
  1842.         if( map != MAIN_VIEW_MAP ) {
  1843.             /*
  1844.              * Radar view colors (not defined by main view's colors).
  1845.              */
  1846.             if( db_bits < 8 ) {
  1847.                 green = t00[NEUTRAL_TEAM] ;
  1848.                 blue =  t00[BLUE_TEAM] ;
  1849.                 }
  1850.             else {
  1851.                 green = 2 ;
  1852.                 blue = 6 ;
  1853.                 set_mapcolor( cmap, green,   0, 255,   0 ) ;
  1854.                 set_mapcolor( cmap,  blue,   0, 128, 255 ) ;
  1855.                 }
  1856.             }
  1857.         }
  1858.     /*
  1859.      * Base view colors (not defined by other view's colors).
  1860.      * We should have at least 256 colors (checked in bzscreen.c).
  1861.      */
  1862.     ramp0 =  64 ;
  1863.     ramp1 =  73 ;
  1864.     ramp2 =  74 ;
  1865.     ramp3 = 127 ;
  1866.     ramp4 = 128 ;
  1867.  
  1868.     if( visualInfo->colormap_size >= ramp4 ) {
  1869.         make_ramp( cmap ) ;
  1870.         }
  1871.  
  1872.     XFlush( display ) ;
  1873.  
  1874.     return ;
  1875. }
  1876.  
  1877.  
  1878.  
  1879. short rampcolor[] = { 60,100,140,180,220,255,220,180,140,120 };
  1880.  
  1881. static void make_ramp(
  1882.     Colormap cmap
  1883.     )
  1884. {
  1885.     short c ;
  1886.     Colorindex i;
  1887.     int t_ramp = sizeof(rampcolor)/sizeof(rampcolor[0]) -  1 ;
  1888.  
  1889.     for( i = ramp2 ; i <= ramp3 ; i++ ) {
  1890.         if( ramp2 == ramp3 ) {
  1891.             c = 200 ;
  1892.             }
  1893.         else {
  1894.             c = (Colorindex)( (float)( i - ramp2 ) /
  1895.                     (float)( ramp3 - ramp2 ) * 195.f + 60.f ) ;
  1896.             }
  1897.         set_mapcolor( cmap, i, c, c, c ) ;
  1898.         if( i == ramp3 ) {
  1899.             set_mapcolor( cmap, ramp4, c, c, c ) ;
  1900.             }
  1901.         }
  1902.     for( i = ramp0 ; i <= ramp1 ; i++ ) {
  1903.         c = rampcolor[(t_ramp*(i-ramp0))/(ramp1-ramp0)];
  1904.         set_mapcolor( cmap, i, c, c, c ) ;
  1905.         }
  1906. }
  1907.  
  1908.  
  1909.  
  1910.  
  1911. Fontchar chars[] = {
  1912.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1913.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1914.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1915.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1916.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1917.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1918.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1919.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1920.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1921.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1922.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1923.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1924.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1925.                       0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0,
  1926.         /* *+c */     0, 0, 0, 0, 0, 0, 180,10,15, 0, 0,12,   0, 0, 0, 0, 0, 0,
  1927.         /* -./ */   150,10,15, 0, 0,12, 165,10,15, 0, 0,12,   0, 0, 0, 0, 0, 0,
  1928.         /* 012 */     0,10,15, 0, 0,12,  15,10,15, 0, 0,12,  30,10,15, 0, 0,12,
  1929.         /* 345 */    45,10,15, 0, 0,12,  60,10,15, 0, 0,12,  75,10,15, 0, 0,12,
  1930.         /* 678 */    90,10,15, 0, 0,12, 105,10,15, 0, 0,12, 120,10,15, 0, 0,12,
  1931.         /* 9   */   135,10,15, 0, 0,12
  1932.                    } ;
  1933. unsigned short raster[] = {
  1934.     /* 0 */        0xbf40,0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0x0000,
  1935.                    0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0xbf40,
  1936.     /* 1 */        0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0000,
  1937.                    0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,
  1938.     /* 2 */        0xbf00,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x3f00,
  1939.                    0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f40,
  1940.     /* 3 */        0x3f00,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f00,
  1941.                    0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f40,
  1942.     /* 4 */        0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f00,
  1943.                    0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,
  1944.     /* 5 */        0x3f40,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f00,
  1945.                    0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xbf00,
  1946.     /* 6 */        0x3f40,0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0x3f00,
  1947.                    0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0xbf00,
  1948.     /* 7 */        0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x0000,
  1949.                    0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f40,
  1950.     /* 8 */        0xbf40,0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0x3f00,
  1951.                    0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0xbf40,
  1952.     /* 9 */        0x3f40,0x0040,0x0040,0x0040,0x0040,0x0040,0x0040,0x3f00,
  1953.                    0x8040,0x8040,0x8040,0x8040,0x8040,0x8040,0xbf40,
  1954.     /* - */        0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3f00,
  1955.                    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  1956.     /* . */        0x0c00,0x0c00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  1957.                    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  1958.     /* + */        0xc000,0xc000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  1959.                    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  1960.                  } ;
  1961.  
  1962. static long    digit_src_elem[][2] = {
  1963.     { 2,  0 },    /* 0 : bottom horiz */
  1964.     { 7,  0 },
  1965.     { 2,  7 },    /* 1 : mid horiz */
  1966.     { 7,  7 },
  1967.     { 2, 14 },    /* 2 : top horiz */
  1968.     { 7, 14 },
  1969.     { 0,  0 },    /* 3 : lower left vert */
  1970.     { 0,  6 },
  1971.     { 0,  8 },    /* 4 : upper left vert */
  1972.     { 0, 14 },
  1973.     { 9,  0 },    /* 5 : lower right vert */
  1974.     { 9,  6 },
  1975.     { 9,  8 },    /* 6 : upper right vert */
  1976.     { 9, 14 }
  1977.     } ;
  1978.  
  1979. static long digit_src[] = {
  1980.     1,                    /* 0 */
  1981.     1,
  1982.     0, 2, 3, 4, 5, 6,
  1983.     5,                    /* 1 */
  1984.     0, 1, 2, 3, 4,
  1985.     5, 6,
  1986.     2,                    /* 2 */
  1987.     4, 5,
  1988.     0, 1, 2, 3, 6,
  1989.     2,                    /* 3 */
  1990.     3, 4,
  1991.     0, 1, 2, 5, 6,
  1992.     3,                    /* 4 */
  1993.     0, 2, 3,
  1994.     1, 4, 5, 6,
  1995.     2,                    /* 5 */
  1996.     3, 6,
  1997.     0, 1, 2, 4, 5,
  1998.     1,                    /* 6 */
  1999.     6,
  2000.     0, 1, 2, 3, 4, 5,
  2001.     4,                    /* 7 */
  2002.     0, 1, 3, 4,
  2003.     2, 5, 6,
  2004.     0,                    /* 8 */
  2005.     0, 1, 2, 3, 4, 5, 6,
  2006.     1,                    /* 9 */
  2007.     3,
  2008.     0, 1, 2, 4, 5, 6,
  2009.     } ;
  2010.     
  2011. static unsigned short halftone[] = {
  2012.     0xaaaa, 0x5555,
  2013.     0xaaaa, 0x5555,
  2014.     0xaaaa, 0x5555,
  2015.     0xaaaa, 0x5555,
  2016.     0xaaaa, 0x5555,
  2017.     0xaaaa, 0x5555,
  2018.     0xaaaa, 0x5555,
  2019.     0xaaaa, 0x5555
  2020.     } ;
  2021.  
  2022.  
  2023.  
  2024. void make_fonts( void )
  2025. {
  2026.     short                fn ;
  2027.     short                ht ;
  2028.     short                nc ;
  2029.     short                nr ;
  2030.     int                    i ;
  2031.     int                    j ;
  2032.     int                    k ;
  2033.     int                    l ;
  2034.     int                    n ;
  2035.  
  2036.     fn = 1 ;
  2037.     ht = 15 ;
  2038.     nc = 58 ;
  2039.     nr = 15*13 ;
  2040.     defrasterfont( fn, ht, nc, chars, nr, raster ) ;
  2041.  
  2042.     k = 0 ;
  2043.     for( i = 0 ; i < 10 ; i++ ) {
  2044.         digit[i][0] = obj_count++ ;
  2045.         makeobj( digit[i][0] = obj_count++ ) ;
  2046.             n = digit_src[k++] ;
  2047.             for( j = 0 ; j < n ; j++ ) {
  2048.                 l = digit_src[k++] << 1 ;
  2049.                 bgnline() ;
  2050.                     v2i( digit_src_elem[l++] ) ;
  2051.                     v2i( digit_src_elem[l] ) ;
  2052.                 endline() ;
  2053.                 }
  2054.         closeobj() ;
  2055.         digit[i][1] = obj_count++ ;
  2056.         makeobj( digit[i][1] = obj_count++ ) ;
  2057.             for( ; j < 7 ; j++ ) {
  2058.                 l = digit_src[k++] << 1 ;
  2059.                 bgnline() ;
  2060.                     v2i( digit_src_elem[l++] ) ;
  2061.                     v2i( digit_src_elem[l] ) ;
  2062.                 endline() ;
  2063.                 }
  2064.         closeobj() ;
  2065.         }
  2066.     defpattern( 1, 16, halftone ) ;
  2067. }
  2068.  
  2069.  
  2070.  
  2071. void make_pieces(
  2072.     unsigned exp_len
  2073.     )
  2074. {
  2075.     unsigned            i ;
  2076.     unsigned            j ;
  2077.     unsigned            k ;
  2078.     unsigned            n_tank ;
  2079.     unsigned            team ;
  2080.     unsigned            sum ;
  2081.     Angle                rx[5] ;
  2082.     Angle                drx[5] ;
  2083.     Angle                rx2[5] ;
  2084.     float                x[5] ;
  2085.     float                y[5] ;
  2086.     float                z[5] ;
  2087.     float                x00[5] ;
  2088.     float                y00[5] ;
  2089.     float                z00[5] ;
  2090.     float                vx[5] ;
  2091.     float                vy[5] ;
  2092.     float                vz[5] ;
  2093.     float                az ;
  2094.     float                f[5] ;
  2095.     float                ang ;
  2096.     float                sin_ang ;
  2097.     float                cos_ang ;
  2098.  
  2099.     for( i = 0 , sum = 0 ; i < exp_len-1 ; i++ ) sum += i ;
  2100.  
  2101.     if( showMan ) {
  2102.         makeobj( man_part = obj_count++ ) ;
  2103.             if( mv_RGB ) {
  2104.                 lmbind( MATERIAL, MAN_MATERIAL ) ;
  2105.                 shademodel( GOURAUD ) ;
  2106.                 }
  2107.             else {
  2108.                 color( white );
  2109.                 }
  2110.             pushmatrix() ;
  2111.             rotate( 900, 'x' ) ;
  2112.  
  2113.             if( mv_RGB ) {
  2114.                 ang = M_PI / 5.f ;
  2115.                 draw_tcirc( 0.f, 2.0f, 0.5f, 20, 0, 1, ang ) ;
  2116.                 }
  2117.             else {
  2118.                 circf( 0.0f, 2.0f, 0.5f ) ;
  2119.                 }
  2120.             sin_ang = fsin( ang ) ;
  2121.             cos_ang = fcos( ang ) ;
  2122.  
  2123.             bgntmesh() ;
  2124.                 normal3f( -sin_ang, 0.f, cos_ang ) ;
  2125.                 f[0] = -0.6f ; f[1] =  0.0f ; v2f( f ) ;
  2126.                 normal3f(  sin_ang, 0.f, cos_ang ) ;
  2127.                 f[0] =  0.6f ; f[1] =  0.0f ; v2f( f ) ;
  2128.                 normal3f( -sin_ang, 0.f, cos_ang ) ;
  2129.                 f[0] = -0.6f ; f[1] =  1.6f ; v2f( f ) ;
  2130.                 normal3f(  sin_ang, 0.f, cos_ang ) ;
  2131.                 f[0] =  0.6f ; f[1] =  1.6f ; v2f( f ) ;
  2132.             endtmesh() ;
  2133.             bgntmesh() ;
  2134.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2135.                 f[0] = -0.6f ; f[1] =  1.5f ; v2f( f ) ;
  2136.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2137.                 f[0] = -1.2f ; f[1] =  1.5f ; v2f( f ) ;
  2138.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2139.                 f[0] = -0.6f ; f[1] =  1.2f ; v2f( f ) ;
  2140.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2141.                 f[0] = -1.2f ; f[1] =  1.2f ; v2f( f ) ;
  2142.             endtmesh() ;
  2143.             bgntmesh() ;
  2144.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2145.                 f[0] =  0.6f ; f[1] =  1.2f ; v2f( f ) ;
  2146.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2147.                 f[0] =  1.2f ; f[1] =  1.2f ; v2f( f ) ;
  2148.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2149.                 f[0] =  0.6f ; f[1] =  1.5f ; v2f( f ) ;
  2150.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2151.                 f[0] =  1.2f ; f[1] =  1.5f ; v2f( f ) ;
  2152.             endtmesh() ;
  2153.             bgntmesh() ;
  2154.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2155.                 f[0] = -1.2f ; f[1] =  1.5f ; v2f( f ) ;
  2156.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2157.                 f[0] = -1.2f ; f[1] =  1.2f ; v2f( f ) ;
  2158.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2159.                 f[0] = -1.6f ; f[1] =  2.0f ; v2f( f ) ;
  2160.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2161.                 f[0] = -1.75f; f[1] =  1.8f ; v2f( f ) ;
  2162.             endtmesh() ;
  2163.             bgntmesh() ;
  2164.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2165.                 f[0] =  1.2f ; f[1] =  1.2f ; v2f( f ) ;
  2166.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2167.                 f[0] =  1.2f ; f[1] =  1.5f ; v2f( f ) ;
  2168.                 normal3f( 0.f,  sin_ang, cos_ang ) ;
  2169.                 f[0] =  1.75f; f[1] =  1.8f ; v2f( f ) ;
  2170.                 normal3f( 0.f, -sin_ang, cos_ang ) ;
  2171.                 f[0] =  1.6f ; f[1] =  2.0f ; v2f( f ) ;
  2172.             endtmesh() ;
  2173.             bgntmesh() ;
  2174.                 normal3f( -sin_ang, 0.f, cos_ang ) ;
  2175.                 f[0] =  0.3f ; f[1] = -2.2f ; v2f( f ) ;
  2176.                 normal3f(  sin_ang, 0.f, cos_ang ) ;
  2177.                 f[0] =  0.8f ; f[1] = -2.2f ; v2f( f ) ;
  2178.                 normal3f( -sin_ang, 0.f, cos_ang ) ;
  2179.                 f[0] =  0.1f ; f[1] =  0.0f ; v2f( f ) ;
  2180.                 normal3f(  sin_ang, 0.f, cos_ang ) ;
  2181.                 f[0] =  0.6f ; f[1] =  0.0f ; v2f( f ) ;
  2182.             endtmesh() ;
  2183.             bgntmesh() ;
  2184.                 normal3f( -sin_ang, 0.f, cos_ang ) ;
  2185.                 f[0] = -0.8f ; f[1] = -2.2f ; v2f( f ) ;
  2186.                 normal3f(  sin_ang, 0.f, cos_ang ) ;
  2187.                 f[0] = -0.3f ; f[1] = -2.2f ; v2f( f ) ;
  2188.                 normal3f( -sin_ang, 0.f, cos_ang ) ;
  2189.                 f[0] = -0.6f ; f[1] =  0.0f ; v2f( f ) ;
  2190.                 normal3f(  sin_ang, 0.f, cos_ang ) ;
  2191.                 f[0] = -0.1f ; f[1] =  0.0f ; v2f( f ) ;
  2192.             endtmesh() ;
  2193.             if( mv_RGB ) {
  2194.                 shademodel( FLAT ) ;
  2195.                 }
  2196.             popmatrix();
  2197.         closeobj();
  2198.         }
  2199.  
  2200.     for( n_tank = 0 ; n_tank < N_TYPES ; n_tank++ ) {
  2201.         az = 1.0f ;
  2202.         for( i = 0 ; i < 5 ; i++ ) {
  2203.             x[i] =  y[i] =  z[i] = 0.0f ;
  2204.             x00[i] = y00[i] = z00[i] = 0.0f ;
  2205.             rx2[i] = rx[i] = 0 ;
  2206.             drx[i] = (rand() % 500 + 200 ) ;
  2207.             vx[i] = (float)(rand() % 21 - 10 ) / 4.f ;
  2208.             vy[i] = (float)(rand() % 21 - 10 ) / 4.f ;
  2209.             vz[i] = (float)(rand() % 5 + 6 ) / 10.f * az *
  2210.                     (float)(sum) / (float)(exp_len-1) ;
  2211.             }
  2212.  
  2213.         x00[0] = 0.f ;
  2214.         y00[0] = (QY04+QY09)/2.f ;
  2215.         z00[0] = (QZ04+QZ10)/2.f ;
  2216.         x00[1] = 0.f ;
  2217.         y00[1] = (n_tank) ? (QY07+QY13)/2.f : (PY07+PY09)/2.f ;
  2218.         z00[1] = (n_tank) ? (QZ05+QZ07)/2.f : (PZ03+PZ04)/2.f ;
  2219.         x00[2] = (n_tank) ?  QX01          :  PX01 ;
  2220.         y00[2] = (n_tank) ? (QY02+QY12)/2.f : (PY01+PY08)/2.f ;
  2221.         z00[2] = (n_tank) ? (QZ01+QZ08)/2.f : (PZ01+PZ06)/2.f ;
  2222.         x00[3] = 0.f ;
  2223.         y00[3] = 0.f ;
  2224.         z00[3] = 0.f ;
  2225.         x00[4] = 0.f ;
  2226.         y00[4] = (n_tank) ? (QY01+QY03)/2.f : (PY01+PY02)/2.f ;
  2227.         z00[4] = (n_tank) ? (QZ01+QZ08)/2.f : (PZ01+PZ06)/2.f ;
  2228.  
  2229.         for( i = 0 ; i < exp_len ; i++ ) {
  2230.             for( k = 0 ; k < N_TEAMS ; k++ ) {
  2231.                 makeobj( explosion[k][i][n_tank] = obj_count++ ) ;
  2232.                     if( mv_RGB ) {
  2233.                         team = 0 ;
  2234.                         lmbind( MATERIAL, tankMaterial[k] ) ;
  2235.                         }
  2236.                     else {
  2237.                         team = k ;
  2238.                         }
  2239.  
  2240.                     pushmatrix();
  2241.                     translate(x[0],y[0],z[0]);
  2242.                     rotate(-rx[0],'x');
  2243.                     translate(-x00[0],-y00[0],-z00[0]);
  2244.                     callobj(front_pit[team][n_tank]);
  2245.                     callobj(right_pit[team][n_tank]);
  2246.                     callobj( left_pit[team][n_tank]);
  2247.                     callobj( back_pit[team][n_tank]);
  2248.                     popmatrix();
  2249.  
  2250.                     pushmatrix();
  2251.                     translate(x[1],y[1],z[1]);
  2252.                     rotate( rx[1],'x');
  2253.                     translate(-x00[1],-y00[1],-z00[1]);
  2254.                     callobj(right_barrel[team][n_tank]);
  2255.                     callobj( left_barrel[team][n_tank]);
  2256.                     callobj(front_barrel[team][n_tank]);
  2257.                     popmatrix();
  2258.  
  2259.                     pushmatrix();
  2260.                     translate(x[2],y[2],z[2]);
  2261.                     rotate( rx[2],'y');
  2262.                     rotate( rx2[2],'y');
  2263.                     translate(-x00[2],-y00[2],-z00[2]);
  2264.                     callobj(right[team][n_tank]);
  2265.                     popmatrix();
  2266.  
  2267.                     pushmatrix();
  2268.                     scale(-1.f,1.f,1.f);
  2269.                     translate(x[2],y[2],z[2]);
  2270.                     rotate(-rx[2],'y');
  2271.                     rotate(-rx2[2],'y');
  2272.                     translate(-x00[2],-y00[2],-z00[2]);
  2273.                     callobj(right[team][n_tank]);
  2274.                     popmatrix();
  2275.  
  2276.                     pushmatrix();
  2277.                     translate(x[4],y[4],z[4]);
  2278.                     rotate( rx[4],'z');
  2279.                     rotate( rx2[4],'x');
  2280.                     translate(-x00[4],-y00[4],-z00[4]);
  2281.                     callobj(back[team][n_tank]);
  2282.                     popmatrix();
  2283.  
  2284.                     if( showMan ) {
  2285.                         pushmatrix();
  2286.                         translate(x[3],y[3],z[3]);
  2287.                         scale(-1.f,1.f,1.f);
  2288.                         rotate(-rx[3],'x');
  2289.                         rotate( rx2[3],'x');
  2290.                         translate(-x00[3],-y00[3],-z00[3]);
  2291.                         callobj(man_part);
  2292.                         popmatrix();
  2293.                         }
  2294.  
  2295.                 closeobj();
  2296.                 }
  2297.             for( j = 0 ; j < 5 ; j++ ) {
  2298.                 x[j] += vx[j] ;
  2299.                 y[j] += vy[j] ;
  2300.                 z[j] += vz[j] ;
  2301.                 rx[j] += drx[j] ;
  2302.                 if( z[j] <= 0.0f ) {
  2303.                     z[j]  = 0.0f ;
  2304.                     vx[j] = 0.0f ;
  2305.                     vy[j] = 0.0f ;
  2306.                     vz[j] = 0.0f ;
  2307.                     drx[j] = 0 ;
  2308.                     switch(j) {
  2309.                         case 0:
  2310.                             rx[j] = 0 ;
  2311.                             break ;
  2312.                         case 1:
  2313.                             rx[j] = 0 ;
  2314.                             break ;
  2315.                         case 2:
  2316.                             rx[j] = 0 ;
  2317.                             rx2[j] = 900 ;
  2318.                             break ;
  2319.                         case 3:
  2320.                             rx[j] = 0 ;
  2321.                             rx2[j] = 900 ;
  2322.                             break ;
  2323.                         case 4:
  2324.                             rx[j] = 0 ;
  2325.                             switch( n_tank ) {
  2326.                                 case 0 :
  2327.                                     rx2[j] = 900 ;
  2328.                                     break ;
  2329.                                 case 1 :
  2330.                                     rx2[j] = -700 ;
  2331.                                     break ;
  2332.                                 case 2 :
  2333.                                     rx2[j] = -400 ;
  2334.                                     break ;
  2335.                                 }
  2336.                             break ;
  2337.                         }
  2338.                     }
  2339.                 vz[j] -= az ;
  2340.                 }
  2341.             }
  2342.         }
  2343. }
  2344.  
  2345.  
  2346.  
  2347. void make_obst( void )
  2348. {
  2349.     int                    i ;
  2350.     int                    v ;
  2351.     unsigned long        *imagedata ;
  2352.     static float        texps[] = { TX_MINFILTER, TX_MIPMAP_BILINEAR,
  2353.                                     TX_MAGFILTER, TX_BILINEAR, TX_NULL } ;
  2354.     static float        tevps[] = { TV_NULL } ;
  2355.     static char            *tex_file = "/usr/demos/data/textures/guarana.rgb" ;
  2356.  
  2357.     if( use_textures ) {
  2358.         if( access( tex_file, R_OK ) < 0 ) {
  2359.             perror( tex_file ) ;
  2360.             use_textures = FALSE ;
  2361.             }
  2362.         else {
  2363.             imagedata = (unsigned long *)longimagedata( tex_file ) ;
  2364.             if( imagedata == NULL ) {
  2365.                 use_textures = FALSE ;
  2366.                 fprintf( stderr, "%s: can't open texture file `%s':", basename,
  2367.                          tex_file ) ;
  2368.                 }
  2369.             else {
  2370.                 texdef2d( 1, 4, 128, 128, imagedata,
  2371.                           sizeof( texps ) / sizeof( texps[0] ), texps ) ;
  2372.                 tevdef( 1, sizeof( tevps ) / sizeof( tevps[0] ), tevps ) ;
  2373.                 }
  2374.             }
  2375.         }
  2376.  
  2377.     for( v = 0 ; v < N_VIEWS ; v++ ) {
  2378.         makeobj( cube[v] = obj_count++ ) ;
  2379.  
  2380.             if( mv_RGB ) {
  2381.                 lmbind( MATERIAL, OBSTACLE_MATERIAL ) ;
  2382.  
  2383.                 if( use_textures ) {
  2384.                     tevbind( TV_ENV0, 1 ) ;
  2385.                     texbind( TX_TEXTURE_0, 1 ) ;
  2386.                     }
  2387.                 }
  2388.  
  2389.             for( i = 0 ; i < 4 ; i++ ) {
  2390.                 switch( order_obst[v][i] ) {
  2391.                     case FRON:
  2392.                         if( !mv_RGB ) color( o00 ) ;
  2393.                         draw_tex_surface( cube_front ) ;
  2394.                         break;
  2395.                     case RIGH:
  2396.                         if( !mv_RGB ) color( o01 ) ;
  2397.                         draw_tex_surface( cube_right ) ;
  2398.                         break;
  2399.                     case LEFT:
  2400.                         if( !mv_RGB ) color( o02 ) ;
  2401.                         draw_tex_surface( cube_left ) ;
  2402.                         break;
  2403.                     case BACK:
  2404.                         if( !mv_RGB ) color( o03 ) ;
  2405.                         draw_tex_surface( cube_back ) ;
  2406.                         break;
  2407.                     case NADA:
  2408.                         break;
  2409.                     }
  2410.                 }
  2411.  
  2412.             if( use_textures )
  2413.                 texbind( TX_TEXTURE_0, 0 ) ;
  2414.  
  2415.         closeobj();
  2416.         }
  2417.  
  2418.     for( v = 0 ; v < N_VIEWS ; v++ ) {
  2419.         makeobj( pyrm[v] = obj_count++ ) ;
  2420.             if( mv_RGB ) {
  2421.                 lmbind( MATERIAL, OBSTACLE_MATERIAL ) ;
  2422.  
  2423.                 if( use_textures ) {
  2424.                     tevbind( TV_ENV0, 1 ) ;
  2425.                     texbind( TX_TEXTURE_0, 1 ) ;
  2426.                     }
  2427.                 }
  2428.  
  2429.             for( i = 0 ; i < 4 ; i++ ) {
  2430.                 switch( order_obst[v][i] ) {
  2431.                     case FRON:
  2432.                         if( !mv_RGB ) color( o04 ) ;
  2433.                         draw_tex_surface( pyrm_front ) ;
  2434.                         break;
  2435.                     case RIGH:
  2436.                         if( !mv_RGB ) color( o05 ) ;
  2437.                         draw_tex_surface( pyrm_right ) ;
  2438.                         break;
  2439.                     case LEFT:
  2440.                         if( !mv_RGB ) color( o06 ) ;
  2441.                         draw_tex_surface( pyrm_left ) ;
  2442.                         break;
  2443.                     case BACK:
  2444.                         if( !mv_RGB ) color( o07 ) ;
  2445.                         draw_tex_surface( pyrm_back ) ;
  2446.                         break;
  2447.                     case NADA:
  2448.                         break;
  2449.                     }
  2450.                 }
  2451.  
  2452.             if( use_textures )
  2453.                 texbind( TX_TEXTURE_0, 0 ) ;
  2454.  
  2455.         closeobj();
  2456.         }
  2457. }
  2458.  
  2459.  
  2460.  
  2461. void make_flags( void )
  2462. {
  2463.     int                    i ;
  2464.     int                    v ;
  2465.     int                    team ;
  2466.  
  2467.     for( team = 1 ; team < N_FLAGS + 1 ; team++ ) {
  2468.         for( v = 0 ; v < N_VIEWS ; v++ ) {
  2469.             makeobj( flag[team-1][v] = obj_count++ ) ;
  2470.  
  2471.                 if( mv_RGB ) {
  2472.                     lmbind( MATERIAL, tankMaterial[team] ) ;
  2473.                     }
  2474.  
  2475.                 for( i = 0 ; i < 4 ; i++ ) {
  2476.                     switch( order_obst[v][i] ) {
  2477.                         case FRON:
  2478.                             if( !mv_RGB ) color( t00[team] ) ;
  2479.                             draw_surface( flag_front_top ) ;
  2480.                             if( !mv_RGB ) color( t07[team] ) ;
  2481.                             draw_surface( flag_front_bot ) ;
  2482.                             break;
  2483.                         case RIGH:
  2484.                             if( !mv_RGB ) color( t02[team] ) ;
  2485.                             draw_surface( flag_right_top ) ;
  2486.                             if( !mv_RGB ) color( t07[team] ) ;
  2487.                             draw_surface( flag_right_bot ) ;
  2488.                             break;
  2489.                         case LEFT:
  2490.                             if( !mv_RGB ) color( t04[team] ) ;
  2491.                             draw_surface( flag_left_top ) ;
  2492.                             if( !mv_RGB ) color( t07[team] ) ;
  2493.                             draw_surface( flag_left_bot ) ;
  2494.                             break;
  2495.                         case BACK:
  2496.                             if( !mv_RGB ) color( t06[team] ) ;
  2497.                             draw_surface( flag_back_top ) ;
  2498.                             if( !mv_RGB ) color( t07[team] ) ;
  2499.                             draw_surface( flag_back_bot ) ;
  2500.                             break;
  2501.                         case NADA:
  2502.                             break;
  2503.                         }
  2504.                     }
  2505.  
  2506.             closeobj();
  2507.             }
  2508.         }
  2509. }
  2510.  
  2511.  
  2512.  
  2513. GL_Object read_logo(
  2514.     const char *filename,
  2515.     unsigned char *logodata,
  2516.     int size,
  2517.     int set_color,
  2518.     int    *logo_side
  2519.     )
  2520. {
  2521.     FILE    *f ;
  2522.     char    line[128] ;
  2523.     int        n = 0 ;
  2524.     int        npts ;
  2525.     int        x ;
  2526.     int        y ;
  2527.     int        version ;
  2528.     int        global = 1 ;
  2529.     int        ln = 0 ;
  2530.     int        nbtm = 0 ;
  2531.  
  2532.     if( ( f = fopen( filename, "r" ) ) == NULL ) {
  2533.         perror( filename ) ;
  2534.         return( 0 ) ;
  2535.         }
  2536.  
  2537.     fgets( line, sizeof( line ), f ) ;
  2538.     ln++ ;
  2539.  
  2540.     if( strcmp( line, "# BZLOGO Version 1.1\n" ) == 0 ) {
  2541.         version = 11 ;
  2542.         }
  2543.     else if( strcmp( line, "# BZLOGO Version 1.0\n" ) == 0 ) {
  2544.         version = 10 ;
  2545.         global = 0 ;
  2546.         }
  2547.     else {
  2548.         fclose( f ) ;
  2549.         fprintf( stderr, "read_logo: bad magic number in logo file.\n" ) ;
  2550.         return( 0 ) ;
  2551.         }
  2552.  
  2553.     while( 1 ) {
  2554.         if( fgets( line, sizeof( line ), f ) == NULL ) {
  2555.             fclose( f ) ;
  2556.             fprintf( stderr, "read_logo: premature end of file.\n" ) ;
  2557.             return( 0 ) ;
  2558.             }
  2559.         ln++ ;
  2560.  
  2561.         if( strcmp( line, "BGNTMESH\n" ) == 0 ) {
  2562.             if( nbtm > 0 ) {
  2563.                 fprintf( stderr, "read_logo: error on line %d -- embedded call "
  2564.                          "to BGNTMESH (use ENDBGNTMESH)\n", ln ) ;
  2565.                 return( 0 ) ;
  2566.                 }
  2567.             nbtm = 1 ;
  2568.             global = 0 ;
  2569.             logodata[n++] = BZL_BGNTMESH ;
  2570.             }
  2571.         else if( strcmp( line, "SWAPTMESH\n" ) == 0 ) {
  2572.             global = 0 ;
  2573.             logodata[n++] = BZL_SWAPTMESH ;
  2574.             }
  2575.         else if( strcmp( line, "ENDBGNTMESH\n" ) == 0 ) {
  2576.             global = 0 ;
  2577.             logodata[n++] = BZL_ENDBGNTMESH ;
  2578.             }
  2579.         else if( strcmp( line, "RETENDTMESH\n" ) == 0 ) {
  2580.             global = 0 ;
  2581.             logodata[n++] = BZL_RETENDTMESH ;
  2582.             break ;
  2583.             }
  2584.         else if( global == 1 && strcmp( line, "LEFTSIDE\n" ) == 0 ) {
  2585.             logodata[n++] = BZL_LEFTSIDE ;
  2586.             }
  2587.         else if( global == 1 && strcmp( line, "RIGHTSIDE\n" ) == 0 ) {
  2588.             logodata[n++] = BZL_RIGHTSIDE ;
  2589.             }
  2590.         else {
  2591.             fclose( f ) ;
  2592.             fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  2593.             return( 0 ) ;
  2594.             }
  2595.  
  2596.         if( global ) {
  2597.             npts = 0 ;
  2598.             }
  2599.         else {
  2600.             if( fscanf( f, "%d", &npts ) != 1 || npts < 1 ) {
  2601.                 fclose( f ) ;
  2602.                 fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  2603.                 return( 0 ) ;
  2604.                 }
  2605.             ln++ ;
  2606.  
  2607.             /*
  2608.              * Check size of logo:
  2609.              *
  2610.              *   NUMBER_PTS_ALREADY + NEXT_CMD + N_PTS + N_PTS * 2
  2611.              */
  2612.             if( n + 2 + 2 * npts >= size ) {
  2613.                 fclose( f ) ;
  2614.                 fprintf( stderr, "read_logo: logo too big "
  2615.                                  "(maximum of %d words)\n", size ) ;
  2616.                 return( 0 ) ;
  2617.                 }
  2618.  
  2619.             logodata[n++] = npts ;
  2620.  
  2621.             while( npts-- ) {
  2622.                 if( fscanf( f, "%d %d", &x, &y ) != 2 || x < 0 || y < 0 ||
  2623.                     x > 255 || y > 255 ) {
  2624.                     fclose( f ) ;
  2625.                     fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  2626.                     return( 0 ) ;
  2627.                     }
  2628.                 ln++ ;
  2629.                 logodata[n++] = x ;
  2630.                 logodata[n++] = y ;
  2631.                 }
  2632.  
  2633.             /*
  2634.              * Get trailing line feed.
  2635.              */
  2636.             if( fgetc( f ) != '\n' ) {
  2637.                 fclose( f ) ;
  2638.                 fprintf( stderr, "read_logo: error reading logo file.\n" ) ;
  2639.                 return( 0 ) ;
  2640.                 }
  2641.             }
  2642.         }
  2643.  
  2644.     fclose( f ) ;
  2645.  
  2646.     return( create_logo( logodata, set_color, logo_side ) ) ;
  2647. }
  2648.  
  2649.  
  2650.  
  2651. GL_Object create_logo(
  2652.     unsigned char *logodata,
  2653.     int set_color,
  2654.     int *logo_side
  2655.     )
  2656. {
  2657.     GL_Object        obj ;
  2658.     unsigned char    glyph ;
  2659.     int                npts ;
  2660.     int                expect_points ;
  2661.     float            pt[2] ;
  2662.     static float    n[3] = { 0., 1., 0. } ;
  2663.  
  2664.     *logo_side = BZL_NOSIDE ;
  2665.  
  2666.     makeobj( obj = obj_count++ ) ;
  2667.  
  2668.         if( set_color ) {
  2669.             if( mv_RGB ) {
  2670.                 cpack( 0x0 ) ;
  2671.                 }
  2672.             else {
  2673.                 color( black ) ;
  2674.                 }
  2675.             }
  2676.  
  2677.         while( ( glyph = *(logodata++) ) != BZL_RETENDTMESH ) {
  2678.             switch( glyph ) {
  2679.                 case BZL_BGNTMESH :
  2680.                     bgntmesh() ;
  2681.                     expect_points = 1 ;
  2682.                     break ;
  2683.                 case BZL_SWAPTMESH :
  2684.                     swaptmesh() ;
  2685.                     expect_points = 1 ;
  2686.                     break ;
  2687.                 case BZL_ENDBGNTMESH :
  2688.                     endtmesh() ;
  2689.                     bgntmesh() ;
  2690.                     expect_points = 1 ;
  2691.                     break ;
  2692.                 case BZL_LEFTSIDE :
  2693.                 case BZL_RIGHTSIDE :
  2694.                     *logo_side = glyph ;
  2695.                     expect_points = 0 ;
  2696.                     break ;
  2697.                 default :
  2698.                     obj_count-- ;
  2699.                     closeobj() ;
  2700.                     delobj( obj ) ;
  2701.                     fprintf( stderr, "create_logo: bad logo info\n" ) ;
  2702.                     return( 0 ) ;
  2703.                 }
  2704.  
  2705.             if( expect_points ) {
  2706.                 npts = *(logodata++) ;
  2707.                 while( npts > 0 ) {
  2708.                     pt[0] = *(logodata++) ;
  2709.                     pt[1] = *(logodata++) ;
  2710.                     v2f( pt ) ;
  2711.                     npts-- ;
  2712.                     }
  2713.                 }
  2714.             }
  2715.         endtmesh() ;
  2716.     closeobj() ;
  2717.  
  2718.     return( obj ) ;
  2719. }
  2720.  
  2721.  
  2722.  
  2723. static void show_logo(
  2724.     GL_Object logo,
  2725.     int type,
  2726.     int is_right,
  2727.     int    side
  2728.     )
  2729. {
  2730.     static float    logo_offset[] = { -6.50, -5.00, -4.00 } ;
  2731.  
  2732.     if( show_logos && logo ) {
  2733.         pushmatrix() ;
  2734.         if( is_right ) {
  2735.             if( side == BZL_LEFTSIDE ) {
  2736.                 translate(  QX01, logo_offset[type]+1.28f, 0.5f ) ;
  2737.                 rot( -90.0f, 'z' ) ;
  2738.                 }
  2739.             else {
  2740.                 translate(  QX01, logo_offset[type]-1.28f, 0.5f ) ;
  2741.                 rot( 90.0f, 'z' ) ;
  2742.                 }
  2743.             }
  2744.         else {
  2745.             if( side == BZL_RIGHTSIDE ) {
  2746.                 translate( -QX01, logo_offset[type]-1.28f, 0.5f ) ;
  2747.                 rot( 90.0f, 'z' ) ;
  2748.                 }
  2749.             else {
  2750.                 translate( -QX01, logo_offset[type]+1.28f, 0.5f ) ;
  2751.                 rot( -90.0f, 'z' ) ;
  2752.                 }
  2753.             }
  2754.         rot( 90.0f, 'x' ) ;
  2755.         scale( 0.0100f, 0.0100f, 0.0100f ) ;
  2756.         callobj( logo ) ;
  2757.         popmatrix() ;
  2758.         }
  2759. }
  2760.  
  2761.